代码之家  ›  专栏  ›  技术社区  ›  Jacky Wang

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

  •  3
  • Jacky Wang  · 技术社区  · 6 年前

    JSR 133 Java Memory Model FAQ ,它指出

    新的内存模型对 易失性字段访问与其他字段访问,无论是否易失性, 线程A写入易失性字段时可见的任何内容 当线程B读取到f时,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() ,表示 The JSR-133 Cookbook for Compiler Writers (实际实现取决于底层CPU体系结构)

    barriers correspond to JSR-133 ordering rules

    硬件采用cache一致性协议,保证了L1,2。。。缓存和主内存。

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

    是否有任何链接或文档显示了JVM如何实现新内存模型的详细信息? 面向编译器编写器的JSR-133食谱 只显示内存屏障是如何使用的,但对缓存只字未提(在寄存器中,L1,2。。缓存,主内存)。

    1 回复  |  直到 6 年前
        1
  •  3
  •   apangin    6 年前

    LoadLoad JSR-133食谱中提到的障碍不仅仅是一些CPU指令。它是一个 符合逻辑的 对JIT编译器也有影响的障碍。特别是,这意味着JIT编译器不会缓存或重新排序 x 关于 v .