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