WEB开发网
开发学院软件开发Java 内存屏障与JVM并发 阅读

内存屏障与JVM并发

 2010-05-11 00:00:00 来源:WEB开发网   
核心提示: 我们可以看到x86 Xeon在第11、12行执行两次volatile写操作,第二次写操作后面紧跟着mfence操作——显式的双向内存屏障,内存屏障与JVM并发(6),下面的连续写操作基于SPARC,10xfb8ecc84:ldub[%l1+0x155],%l3;...e6

我们可以看到x86 Xeon在第11、12行执行两次volatile写操作。第二次写操作后面紧跟着mfence操作——显式的双向内存屏障。

下面的连续写操作基于SPARC。

 1 0xfb8ecc84: ldub [ %l1 + 0x155 ], %l3 ;...e60c6155 
 2 0xfb8ecc88: cmp %l3, 0        ;...80a4e000 
 3 0xfb8ecc8c: bne,pn  %icc, 0xfb8eccb0 ;...12400009 
 4 0xfb8ecc90: nop            ;...01000000 
 5 0xfb8ecc94: st %l0, [ %l1 + 0x150 ] ;...e0246150 
 6 0xfb8ecc98: clrb [ %l1 + 0x154 ]   ;...c02c6154 
 7 0xfb8ecc9c: membar #StoreLoad    ;...8143e002 
 8 0xfb8ecca0: sethi %hi(0xff3fc000), %l0 ;...213fcff0 
 9 0xfb8ecca4: ld [ %l0 ], %g0     ;...c0042000 
10 0xfb8ecca8: ret            ;...81c7e008 
11 0xfb8eccac: restore          ;...81e80000 

我们看到在第五、六行存在两次volatile写操作。第二次写操作后面是一个membar指令——显式的双向内存屏障。

x86和SPARC的指令流与Itanium的指令流存在一个重要区别。JVM在x86和SPARC上通过内存屏障跟踪连续写操作,但是在两次写操作之间没有放置内存屏障。另一方面,Itanium的指令流在两次写操作之间存在内存屏障。为何JVM在不同的硬件架构之间表现不一?因为硬件架构都有自己的内存模型,每一个内存模型有一套一致性保障。某些内存模型,如x86和SPARC等,拥有强大的一致性保障。另一些内存模型,如Itanium、 PowerPC和Alpha,是一种弱保障。例如,x86和SPARC不会重新排序连续写操作——也就没有必要放置内存屏障。Itanium、 PowerPC和Alpha将重新排序连续写操作——因此JVM必须在两者之间放置内存屏障。JVM使用内存屏障减少Java内存模型和硬件内存模型之间的距离。

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:内存 屏障 JVM

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接