java – LoadLoad屏障真的有什么作用?
在
Java中,当我们有两个线程共享以下变量时:
int a; volatile int b; 如果线程1执行: a = 5; b = 6; 然后在这两个指令之间插入一个StoreStore屏障,“a”正在刷新回主存储器. 现在如果线程2: if(b == 6) a++; 在其间插入一个LoadLoad屏障,我们保证如果新值’b’可见,那么新值’a’也是可见的.但实际上是如何实现的? LoadLoad是否使CPU缓存/寄存器无效?或者只是指示CPU从CPU再次获取从volatile读取的变量的值? 我已经找到关于LoadLoad屏障的信息(http://gee.cs.oswego.edu/dl/jmm/cookbook.html):
但它并没有真正解释这是如何实现的. 解决方法
我将举一个例子说明如何实现.您可以阅读更多关于
here的详细信息.对于x86处理器,您指出LoadLoad最终成为no-ops.在我链接的文章中指出
所以本质上唯一需要的障碍是用于x86架构的StoreLoad.那么在低层次上如何实现呢? 这是博客摘录 以下是为易失性和非易失性读取生成的代码: nop ;*synchronization entry mov 0x10(%rsi),%rax ;*getfield x 而对于易失性的写作: xchg %ax,%ax movq $0xab,0x10(%rbx) lock addl $0x0,(%rsp) ;*putfield x 锁指令是道格食谱所列的StoreLoad.但是锁定指令也将所有读取与其他进程同步为listed
这减少了为易失性负载发出LoadLoad LoadStore障碍的开销. 所有这一切,我会重申一下assylias指出的.发生这种情况对于开发人员来说不是很重要(如果您对另一个故事的处理器/编译器实现者感兴趣). volatile关键字是一种界面说法 >您将获得由另一个线程编写的最新更新>您不会被JIT编译器优化烧毁. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java – 安全地处理AppEngine中的并发Memcache更新
- java9中gc log参数迁移
- java – 关于静态保持单体模式
- java – 将组件放在玻璃窗格上
- java – 嵌入式码头和正常关机
- java.lang.IllegalStateException: Ambiguous handler meth
- Spring Data Jpa+SpringMVC+Jquery.pagination.js实现分页示
- 详解Spring Boot 部署jar和war的区别
- java – 渲染android.support.design.widget.CoordinatorLa
- 浅析Java 9 Optional API 新增方法