Документация Oracle по атомарному доступу (по адресу http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html) говорит следующее:
"изменчивая переменная устанавливает отношение "происходит до"... Это означает, что... когда поток читает изменчивую переменную, он видит не только последнее изменение изменчивой, но и побочные эффекты кода, который привел к перемена."
У меня проблемы с обдумыванием этого. Я понимаю, как работают изменчивые переменные (в >= Java 5), но мне интересно, как java решает, какой побочный эффект «привел» к изменению изменчивой переменной.
Итак, я думаю, мой вопрос: какие побочные эффекты даются этой гарантией?
РЕДАКТИРОВАТЬ:
Итак, я узнал, что если поток A изменяет изменчивую переменную, а затем поток B читает ее, все записи из потока A, которые произошли до записи в volatile переменную, «сделаны согласованными» по отношению к потоку B (т. е. кэшированные значения переменных, подлежащих вышеупомянутой записи потоком A, становятся недействительными в потоке B). Поправьте меня если я ошибаюсь.
a
иb
b, которые являются изменчивыми. Наш код выполняетif (b) read a
. В ассемблере: Вместоld r0, b; jnz r0, ...; ld r0, a
процессор мог бы сделатьld r1, a; ld r0, b; jnz r0, ...;
И теперь у нас есть очевидное состояние гонки: мы можем прочитать старое значение a и новое значение b и никогда не проверять, изменилось ли a. - person Voo   schedule 07.02.2012