在
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体系结构)
硬件采用cache一致性协议,保证了L1,2。。。缓存和主内存。
但我想这些机制似乎不够。为了保证看到
42
在里面
读卡器()
,JVM(JIT)是否必须读取
五
(非挥发性)和
十
(易失性)从主存储器(或L1,2。。由硬件控制的缓存)而不是CPU寄存器?
是否有任何链接或文档显示了JVM如何实现新内存模型的详细信息?
面向编译器编写器的JSR-133食谱
只显示内存屏障是如何使用的,但对缓存只字未提(在寄存器中,L1,2。。缓存,主内存)。