在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寄存器(易失性)?
MM们
相关分类