为了账号安全,请及时绑定邮箱和手机立即绑定

关于 Java 如何在新内存模型中实现 volatile 的谜题 (JSR 133)

关于 Java 如何在新内存模型中实现 volatile 的谜题 (JSR 133)

月关宝盒 2021-06-21 17:05:05
在JSR 133 Java Memory Model FAQ 中,它指出新的内存模型对 volatile 字段访问与其他字段访问(无论是否 volatile )的重新排序施加了更严格的限制,线程 A 在写入 volatile 字段 f 时可见的任何内容在线程 B 读取 f 时变为可见它还给出了如何使用 volatile 字段的示例class VolatileExample {  int x = 0;  volatile boolean v = false;  public void writer() {    x = 42;    v = true;  }  public void reader() {    if (v == true) {      //uses x - guaranteed to see 42.    }  }}在上面的代码中,JVM(JIT?)将插入LoadLoad的负载之间的存储器阻挡层/围栏v和的负载x中reader(),指的是所述的JSR-133食谱为编译器作者(实际执行取决于基础CPU架构)并且硬件使用缓存一致性协议来确保L1,2...缓存和主内存之间的一致性。但我猜这些机制似乎还不够。为了保证看到42在reader(),并JVM(JIT)必须读取v(非挥发性的)和x从主存储器(或L1,2 ..这由硬件控制的高速缓存),而不是CPU寄存器(易失性)?
查看完整描述

1 回答

?
MM们

TA贡献1886条经验 获得超2个赞

LoadLoadJSR-133 Cookbook 中提到的屏障不仅仅是一些 CPU 指令。它也是一个对 JIT 编译器有影响的逻辑障碍。特别地,这意味着JIT编译器将不缓存或重新排序的负载x相对于的负载v


查看完整回答
反对 回复 2021-06-30
  • 1 回答
  • 0 关注
  • 162 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信