Рассмотрим a volatile int sharedVar. Мы знаем, что JLS дает нам следующие гарантии:
- каждое действие пишущего потока
wперед его записью значенияiвsharedVarв программном порядкеhappens-beforeдействие записи; - запись значения
iнаwhappens-beforeуспешное чтениеiизsharedVarс помощью потока чтенияr; - успешное чтение
iизsharedVarпотоком чтенияrhappens-beforeвсех последующих действийrв порядке выполнения программы.
Тем не менее, по-прежнему нет гарантии времени на настенные часы, указывающие на , когда поток чтения будет наблюдать значение i. Реализация, которая просто никогда позволяет потоку чтения видеть, что это значение по-прежнему соответствует этому контракту.
Я подумал об этом некоторое время, и я не вижу никаких лазеек, но, полагаю, должно быть. Пожалуйста, указывайте на лазейку в моих рассуждениях.