我是从A. Shipilev的博客那里获得的,JMM适用于操作,而不适用于带有以下代码和声明的声明
...他们说g = 1发生在int lg = g之前。通过逻辑得出结论int lx = x,总会看到x = 1(因为x = 1 hb g = 1,并且int lg = g hb int lx = x),这也进一步破坏了推理。这是一个非常容易犯的错误,并且您必须记住,在操作(而不是语句)应用于操作之前(以及JMM形式主义中的其他命令)。
https://shipilev.net/blog/2016/close-encounters-of-jmm-kind/#pitfall-volatiles-wrong
我的印象是两者都是相同的。我缺少任何根本的区别吗?
int x;
volatile int g;
void m() {
x = 1;
g = 1;
}
void r() {
int lg = g;
int lx = x;
}