Давайте с начала:
Thread1: x = 1;
Thread2: r1 = x; // можно ли здесь увидеть 0?
Простой ответ: конечно, может. T2 выполняется "перед" T1 и всё тривиально. И это правильный ответ, но чрезмерно упрощённый: он подразумевает, что есть некоторая референсная система отсчёта, в которой а) определено "перед"; б) память работает последовательно в этой с.о. Это иллюзия глобальной упорядоченной памяти, глобального времени/порядка. Оно даёт вам слишком узкое понимание проблемы: даёт только подмножество возможных случаев.
Более широкий ответ: конечно, может. T2 может выполниться, и НЕ увидеть запись, не важно "до" или "после" него выполнился T1. У Т1 и T2 нет согласованного понимания о времени вообще. Эффекты распространяются как попало, и пока мы что-то не увидели, мы это не увидели. Собственно распространение частичных эффектов и несёт в себе некоторую информацию о "логическом" времени.