Но почему? Флаг не является изменчивым, поэтому его значение было обновлено немедленно? Всегда!
Вам просто повезло;или неудачно, в зависимости от вашей точки зрения. Я попробовал это на Ideone и обнаружил, что время ожидания истекло, а не завершилось нормально.
Помните: отсутствие возможности наблюдать ошибку параллелизма - это не то же самое, что отсутствие ошибки параллелизма.
Вы можете быть уверены в коде, когда в соответствии со спецификацией можете доказать, что ошибок нет. Это не значит, что код будет работать правильно;это просто означает, что проблемы в реализации JVM.
В частности, вы не можете доказать, что этот код будет работать правильно, потому что между 1011 * не существует отношения случай-до . flag
во втором потоке, а чтение в первом. Добавление volatile
создает эту гарантию, потому что энергозависимая запись происходит перед энергозависимым чтением.
Нельзя сказать, что никогда не будет работать без энергозависимой, просто это не гарантируется: JVM имеет толькоочищать кэшированные значения потока, по крайней мере, так часто, как этого требует спецификация, но может делать это чаще или вообще не кэшировать значения.