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

内存屏障与JVM并发

 2010-05-11 00:00:00 来源:WEB开发网   
核心提示: 我们又一次在第14行看到了带有lock前缀的写操作,这确保了变量的新值(写操作)会在其他所有后续内存操作之前完成,内存屏障与JVM并发(9),内存屏障能够避免 JVM非常擅于消除不必要的内存屏障,通常JVM很幸运,x86和SPARC内存模型的一致性保障足够强壮以消除读volatile变量时所需的

我们又一次在第14行看到了带有lock前缀的写操作。这确保了变量的新值(写操作)会在其他所有后续内存操作之前完成。

内存屏障能够避免

JVM非常擅于消除不必要的内存屏障。通常JVM很幸运,因为硬件内存模型的一致性保障强于或者等于Java内存模型。在这种情况下,JVM只是简单地插 入一个no op语句,而不是真实的内存屏障。例如,x86和SPARC内存模型的一致性保障足够强壮以消除读volatile变量时所需的内存屏障。还记得在 Itanium上两次读操作之间的显式单向内存屏障吗?x86上的Dekker算法中连续volatile读操作的汇编指令之间没有任何内存屏障。

x86平台上共享内存的连续读操作。

 1 0x03f83422: mov  $0x148,%ebp    ;...bd480100 00 
 2 0x03f83427: mov  $0x14d,%edx    ;...ba4d0100 00 
 3 0x03f8342c: movsbl -0x505a72f0(%edx),%ebx ;...0fbe9a10 8da5af 
 4 0x03f83433: test  %ebx,%ebx     ;...85db 
 5 0x03f83435: jne  0x03f83460     ;...7529 
 6 0x03f83437: movl  $0x1,-0x505a72f0(%ebp) ;...c785108d a5af01 
 7 0x03f83441: movb  $0x0,-0x505a72f0(%edi) ;...c687108d a5af00 
 8 0x03f83448: mfence          ;...0faef0 
 9 0x03f8344b: add  $0x8,%esp     ;...83c408 
10 0x03f8344e: pop  %ebp        ;...5d 
11 0x03f8344f: test  %eax,0xb78ec000  ;...850500c0 8eb7 
12 0x03f83455: ret            ;...c3 
13 0x03f83456: nopw  0x0(%eax,%eax,1)  ;...66660f1f 840000 
14 0x03f83460: mov  -0x505a72f0(%ebp),%ebx ;...8b9d108d a5af 
15 0x03f83466: test  %edi,0xb78ec000  ;...853d00c0 8eb7 

上一页  4 5 6 7 8 9 10  下一页

Tags:内存 屏障 JVM

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