在 Java 中,当我们有两个线程共享以下变量时:
int a;
volatile int b;
如果线程 1 这样做:
a = 5;
b = 6;
然后在这两条指令之间插入一个 StoreStore 屏障,并将“a”刷新回主存储器。
现在如果线程 2 这样做:
if(b == 6)
a++;
之间插入了一个 LoadLoad 屏障,我们保证如果“b”的新值是可见的,那么“a”的新值也是可见的。但实际上这是如何实现的呢?LoadLoad 是否会使 CPU 缓存/寄存器无效?或者只是指示 CPU 从 CPU 再次从 volatile 中获取从 volatile 读取的变量的值?
我找到了有关 LoadLoad 屏障的信息(http://gee.cs.oswego.edu/dl/jmm/cookbook.html):
LoadLoad Barriers 顺序:Load1;加载加载;Load2 确保在 Load2 访问数据之前加载 Load1 的数据,并加载所有后续加载指令。通常,在执行推测加载和/或等待加载指令可以绕过等待存储的无序处理的处理器上需要显式 LoadLoad 屏障。在保证始终保持加载顺序的处理器上,障碍相当于无操作。
但它并没有真正解释这是如何实现的。