在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寄存器(易失性)?
1 回答
![?](http://img1.sycdn.imooc.com/545869470001a00302200220-100-100.jpg)
MM们
TA贡献1886条经验 获得超2个赞
LoadLoad
JSR-133 Cookbook 中提到的屏障不仅仅是一些 CPU 指令。它也是一个对 JIT 编译器有影响的逻辑障碍。特别地,这意味着JIT编译器将不缓存或重新排序的负载x
相对于的负载v
。
添加回答
举报
0/150
提交
取消