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

在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架构)

http://img1.mukewang.com/60dc32ea00011b6d05820256.jpg

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

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


月关宝盒
浏览 163回答 1
1回答

MM们

LoadLoadJSR-133 Cookbook 中提到的屏障不仅仅是一些 CPU 指令。它也是一个对 JIT 编译器有影响的逻辑障碍。特别地,这意味着JIT编译器将不缓存或重新排序的负载x相对于的负载v。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java