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

标签 java concurrency jvm volatile

JSR 133 Java Memory Model FAQ , 它指出

the new memory model places stricter constraints on reordering of volatile field accesses with other field accesses, volatile or not, anything that was visible to thread A when it writes to volatile field f becomes visible to thread B when it reads 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?)会在 v 的加载和 x< 的加载之间插入一个 LoadLoad 内存屏障/栅栏reader() 中,引用 The JSR-133 Cookbook for Compiler Writers (实际实现取决于底层CPU架构)

barriers correspond to JSR-133 ordering rules

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

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

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

最佳答案

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

关于java - 关于 Java 如何在新内存模型中实现 volatile 的谜题 (JSR 133),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51700223/

相关文章:

Java 8 元空间垃圾回收

java - 将 JVM 嵌入到微 Controller 中

java - JsonPath 忽略输出的调试日志

Java 计数器计数不正确

node.js - 如何在 Node js 中以干净可读的格式显示输出?

java - 禁用后对 jButton 执行的操作

java - 测试是否调用了另一个方法

java - 在 Scala 中实现带条件的嵌套循环

java - 如何在java中最好地实现 "fetch-and-set"?

java - JVM 是否进行运行时常量折叠?