В глава 17 спецификации языка Java, есть раздел, объясняющий, почему "происходит - до согласованности недостаточно". И вот пример:
At first, x = y = 0
Thread 1 | Thread 2
r1 = x; | r2 = y;
if (r1 != 0) y = 1; | if (r2 != 0) x = 1;
И вот возможная трассировка выполнения:
r1 = x; // sees write of x = 1
y = 1;
r2 = y; // sees write of y = 1
x = 1;
Как это могло произойти? Я сбиваю с толку то, что, когда первое действие видит, что x = 1, не означает ли это, что условие r2!= 0 стало истинным, и, следовательно, y было присвоено 1? Но в этом порядке y = 1 возникает после r1 = x. Где я ошибся, чтобы понять пример? И как я должен правильно интерпретировать этот пример?