Могу ещё дальше мозг форматнуть. Смотрите опять на пример:
Thread 2: y = 1
Thread 3: r2 = y; // r2 <- 0
Thread 4: r3 = y; // r3 <- 1
Вы сказали, что такое возможно, потому что "Поток 3 перед потоком 2, а 4-ый после второго". И это правильный ответ. Но есть *ещё один правильный ответ*, который не очевиден без гвоздодёра:
Thread 2: y = 1 // выполнился первым
Thread 3: r2 = y; // выполнился вторым, и НЕ УВИДЕЛ 1
Thread 4: r3 = y;
Другими словами, выполнение "первый-второй-третий" НЕ говорит, что эффекты видны в таком порядке. (То есть, у нас нет некоторого строго-консенсусного последовательного хранилища) (То есть, у нас нет глобального порядка) (То есть, это самое "время" нам вообще ничем не помогает). В этом состоит гвоздь иллюзии про сериализованную память.
Хардварная аналогия, если так хочется: исполнение реально доехало до инструкций в каждом потоке в порядке "первый-второй-третий", каждый поговорил с подсистемой памяти, но получил *разные* ответы! (ввиду простых физических ограничений во время полёта обеих записей).