这更像是一个理论问题.我不确定所有的概念,编译器行为等是否都是最新的并且仍然在使用,但我想确认我是否正确理解了我正在努力学习的一些概念.
语言是Java.
从我到目前为止所理解的,在X86架构上,StoreLoad障碍(尽管用于实现它们的确切的CPU指令)是在Volatile写入之后放置的,以使其在其他线程中的后续易失性读取中可见(因为x86不保证较新的读取总是看到较旧的写入)(参考http://shipilev.net/blog/2014/on-the-fence-with-dependencies/)
现在从这里(http://jpbempel.blogspot.it/2013/05/volatile-and-memory-barriers.html)我看到:
public class TestJIT
{
private volatile static int field1;
private static int field2;
private static int field3;
private static int field4;
private static int field5;
private volatile static int field6;
private static void assign(int i)
{
field1 = i << 1; // volatile
field2 = i << 2;
field3 = i << 3;
field4 = i << 4;
field5 = i << 5;
field6 = i << 6; // volatile.
}
public …Run Code Online (Sandbox Code Playgroud)