在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架构)
并且硬件使用缓存一致性协议(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/