深入java底层内存屏障与jvm并发详解

深入java底层内存屏障与jvm并发详解

ID:34480540

大小:42.67 KB

页数:7页

时间:2019-03-06

深入java底层内存屏障与jvm并发详解_第1页
深入java底层内存屏障与jvm并发详解_第2页
深入java底层内存屏障与jvm并发详解_第3页
深入java底层内存屏障与jvm并发详解_第4页
深入java底层内存屏障与jvm并发详解_第5页
资源描述:

《深入java底层内存屏障与jvm并发详解》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、http://www.bjaccp.com深入Java底层:内存屏障与JVM并发详解内存屏障,又称内存栅栏,是一组处理器指令,用于实现对内存操作的顺序限制。本文假定读者已经充分掌握了相关概念和Java内存模型,不讨论并发互斥、并行机制和原子性。内存屏障用来实现并发编程中称为可见性(visibility)的同样重要的作用。  内存屏障为何重要?  对主存的一次访问一般花费硬件的数百次时钟周期。处理器通过缓存(caching)能够从数量级上降低内存延迟的成本这些缓存为了性能重新排列待定内存操作的顺序。也就是说,程序的读写操作不一定会按照它要求处理器的顺序执行。

2、当数据是不可变的,同时/或者数据限制在线程范围内,这些优化是无害的。  如果把这些优化与对称多处理(symmetricmulti-processing)和共享可变状态(sharedmutablestate)结合,那么就是一场噩梦。当基于共享可变状态的内存操作被重新排序时,程序可能行为不定。一个线程写入的数据可能被其他线程可见,原因是数据写入的顺序不一致。适当的放置内存屏障通过强制处理器顺序执行待定的内存操作来避免这个问题。  内存屏障的协调作用  内存屏障不直接由JVM暴露,相反它们被JVM插入到指令序列中以维持语言层并发原语的语义。我们研究几个简单Jav

3、a程序的源代码和汇编指令。首先快速看一下Dekker算法中的内存屏障。该算法利用volatile变量协调两个线程之间的共享资源访问。  请不要关注该算法的出色细节。哪些部分是相关的?每个线程通过发信号试图进入代码第一行的关键区域。如果线程在第三行意识到冲突(两个线程都要访问),通过turn变量的操作来解决。在任何时刻只有一个线程可以访问关键区域。  1.//coderunbyfirstthread    //coderunbysecondthread  2.  3.1   intentFirst=true;         intentSecond=tru

4、e;  4.2  5.3   while(intentSecond)  while(intentFirst)      //volatileread  6.4    if(turn!=0){     if(turn!=1){      //volatileread  7.5      intentFirst=false;       intentSecond=false;  8.6      while(turn!=0){}       while(turn!=1){}  9.7      intentFirst=true;       intentSec

5、ond=true;  10.8    }              }  11.9  12.10   criticalSection();  criticalSection();  13.11  14.12   turn=1;    turn=0;                //volatilewrite  15.13   intentFirst=false;  intentSecond=false;    //volatilewrite  硬件优化可以在没有内存屏障的情况下打乱这段代码,即使编译器按照程序员的想法顺序列出所有的内存操作。考虑第三、四行

6、的两次顺序volatile读操作。每一个线程检查其他线程是否发信号想进入关键区域,然后检查轮到谁操作了。考虑第12、13行的两次顺序写操作。每一个线程把访问权释放给其他线程,然后撤销自己访问关键区域的意图。读线程应该从不期望在其他线程撤销访问意愿后观察到其他线程对turn变量的写操作。这是个灾难。  但是如果这些变量没有volatile修饰符,这的确会发生!例如,没有volatile修饰符,第二个线程在第一个线程对turn执行写操作(倒数第二行)之前可能会观察到第一个线程对intentFirst(倒数第一行)的写操作。关键词volatile避免了这种情况,

7、因为它在对turn变量的写操作和对http://www.bjaccp.comintentFirst变量的写操作之间创建了一个先后关系。编译器无法重新排序这些写操作,如果必要,它会利用一个内存屏障禁止处理器重排序。让我们来看看一些实现细节。  PrintAssemblyHotSpot选项是JVM的一个诊断标志,允许我们获取JIT编译器生成的汇编指令。这需要最新的OpenJDK版本或者新HotSpotupdate14或者更高版本。通过需要一个反编译插件。Kenai项目提供了用于Solaris、Linux和BSD的插件二进制文件。hsdis是另一款可以在Wind

8、ows通过源码构建的插件。  两次顺序读操作的第一次(第三行)的汇

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。