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

内存屏障与JVM并发

 2010-05-11 00:00:00 来源:WEB开发网   
核心提示: 第三行和第十四行存在volatile读操作,而且都没有伴随内存屏障,内存屏障与JVM并发(10),也就是说,x86和SPARC上的volatile读操作的性能下降对于代码的优 化影响很小——指令本身和常规读操作一样,让我们看看 JVM在单 处理器运行时如何对待内存屏障,以

第三行和第十四行存在volatile读操作,而且都没有伴随内存屏障。也就是说,x86和SPARC上的volatile读操作的性能下降对于代码的优 化影响很小——指令本身和常规读操作一样。

单向内存屏障本质上比双向屏障性能要好一些。JVM在确保单向屏障即可的情况下会避免使用双向屏障。本文的第一个例子展示了这点。Itanium平台上的 连续两次读操作被插入单向内存屏障。如果读操作插入显式双向内存屏障,程序仍然正确,但是延迟比较长。

动态编译

静态编译器在构建阶段决定的一切事情,在动态编译器那里都可以在运行时决定,甚至更多。更多信息意味着存在更多机会可以优化。例如,让我们看看 JVM在单 处理器运行时如何对待内存屏障。以下指令流来自于通过Dekker算法实现两次连续volatile写操作的运行时编译。程序运行于 x86硬件上的单处理器模式中的VMWare工作站镜像。

 1 0x017b474c: push  %ebp        ;...55 
 2 0x017b474d: sub  $0x8,%esp     ;...81ec0800 0000 
 3 0x017b4753: mov  $0x14c,%edi    ;...bf4c0100 00 
 4 0x017b4758: movb  $0x1,-0x507572f0(%edi) ;...c687108d 8aaf01 
 5 0x017b475f: mov  $0x148,%ebp    ;...bd480100 00 
 6 0x017b4764: mov  $0x14d,%edx    ;...ba4d0100 00 
 7 0x017b4769: movsbl -0x507572f0(%edx),%ebx ;...0fbe9a10 8d8aaf 
 8 0x017b4770: test  %ebx,%ebx     ;...85db 
 9 0x017b4772: jne  0x017b4790     ;...751c 
10 0x017b4774: movl  $0x1,-0x507572f0(%ebp) ;...c785108d 8aaf01
11 0x017b477e: movb  $0x0,-0x507572f0(%edi) ;...c687108d 8aaf00 
12 0x017b4785: add  $0x8,%esp     ;...83c408 
13 0x017b4788: pop  %ebp        ;...5d 

上一页  5 6 7 8 9 10 

Tags:内存 屏障 JVM

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