Из блога А. Шипилева я узнал, что 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;
}