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

时间:2018-08-06 03:29:40

标签: java concurrency jvm volatile

JSR 133 Java Memory Model FAQ中,它指出

  

新的内存模型对重新排序具有更严格的约束   易失性字段访问与其他易失性字段访问,   线程A写入volatile字段时可见的任何内容   当线程B读取f时,f变得可见

它还给出了如何使用易失性字段的示例

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()内存屏障/栅栏,指的是The JSR-133 Cookbook for Compiler Writers(实际实现取决于底层CPU架构)

barriers correspond to JSR-133 ordering rules

并且硬件使用缓存一致性协议来确保L1,2 ...缓存和主内存之间的一致性。

但是我想这些机制似乎还不够。为了保证在42中看到reader(),JVM(JIT)是否必须从主内存(或L1)读取v(非易失性)和x(易失性) ,2 ..由硬件控制的缓存)而不是CPU寄存器?

是否有任何链接或文档显示了JVM如何实现新内存模型的详细信息? The JSR-133 Cookbook for Compiler Writers仅显示如何使用内存屏障,但没有提及缓存(在寄存器L1,2 ..缓存,主内存中)。

1 个答案:

答案 0 :(得分:3)

《 JSR-133食谱》中提到的

LoadLoad障碍不仅仅是一些CPU指令。这也是对JIT编译器产生影响的逻辑障碍。特别是,这意味着JIT编译器不会相对于x的负载来缓存v的负载或对其进行重新排序。