快速业务通道

内存屏障与JVM并发 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
mic.AtomicInteger;    class Counter{      static AtomicInteger counter = new AtomicInteger (0);      public static void main(String[] args){        for(int i = 0; i < 1000000; i++)          counter.incrementAndGet();      }    }

$ java -XX:+UnlockDiagnosticVMOptions - XX:PrintAssemblyOptions=hsdis-print-bytes - XX:CompileCommand=print,*AtomicInteger.incrementAndGet Counter

1 0x024451f7: push  %ebp        ;...55   2 0x024451f8: mov  %esp,%ebp     ;...8bec   3 0x024451fa: sub  $0x38,%esp     ;...83ec38   4 0x024451fd: jmp  0x0244520a     ;...e9080000 00   5 0x02445202: xchg  %ax,%ax      ;...6690   6 0x02445204: test  %eax,0xb771e100  ;...850500e1 71b7   7 0x0244520a: mov  0x8(%ecx),%eax   ;...8b4108   8 0x0244520d: mov  %eax,%esi     ;...8bf0   9 0x0244520f: inc  %esi        ;...46 10 0x02445210: mov  $0x9a3f03d0,%edi  ;...bfd0033f 9a 11 0x02445215: mov  0x160(%edi),%edi  ;...8bbf6001 0000 12 0x0244521b: mov  %ecx,%edi     ;...8bf9 13 0x0244521d: add  $0x8,%edi     ;...83c708 14 0x02445220: lock cmpxchg %esi,(%edi) ;...f00fb137 15 0x02445224: mov  $0x1,%eax     ;...b8010000 00 16 0x02445229: je   0x02445234     ;...0f840500 0000 17 0x0244522f: mov  $0x0,%eax     ;...b8000000 00 18 0x02445234: cmp  $0x0,%eax     ;...83f800 19 0x02445237: je   0x02445204     ;...74cb 20 0x02445239: mov  %esi,%eax     ;...8bc6 21 0x0244523b: mov  %ebp,%esp     ;...8be5 22 0x0244523d: pop  %ebp        ;...5d

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

内存屏障与JVM并发(6)

时间:2011-09-04 infoq 崔康译

内存屏障能够避免

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            ;

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号