在JSR 133 Java Memory Model FAQ中,它指出
新的内存模型对重新排序具有更严格的约束 易失性字段访问与其他易失性字段访问, 线程A写入volatile字段时可见的任何内容 当线程B读取f时,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?)将在LoadLoad
的负载和v
中的x
的负载之间插入reader()
内存屏障/栅栏,指的是The JSR-133 Cookbook for Compiler Writers(实际实现取决于底层CPU架构)
并且硬件使用缓存一致性协议来确保L1,2 ...缓存和主内存之间的一致性。
但是我想这些机制似乎还不够。为了保证在42
中看到reader()
,JVM(JIT)是否必须从主内存(或L1)读取v
(非易失性)和x
(易失性) ,2 ..由硬件控制的缓存)而不是CPU寄存器?
是否有任何链接或文档显示了JVM如何实现新内存模型的详细信息? The JSR-133 Cookbook for Compiler Writers仅显示如何使用内存屏障,但没有提及缓存(在寄存器L1,2 ..缓存,主内存中)。
答案 0 :(得分:3)
LoadLoad
障碍不仅仅是一些CPU指令。这也是对JIT编译器产生影响的逻辑障碍。特别是,这意味着JIT编译器不会相对于x
的负载来缓存v
的负载或对其进行重新排序。