Java volatile и побочные эффекты

В документации Oracle по атомарному доступу (на http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html) говорится следующее:

"переменная volatile устанавливает связь happens-before. ... . Это означает, что ... когда поток читает переменную volatile, он видит не только последнее изменение переменной volatile, но и побочные эффекты кода, который привел к этому изменению."

Мне трудно понять это. Я понимаю, как работают волатильные переменные (в >= Java 5), но мне интересно, как java решает, какой побочный эффект "привел" к изменению волатильной переменной.

Так что я думаю, мой вопрос в том, какие побочные эффекты получают такую гарантию?

EDIT:

Итак, я узнал, что если поток A изменяет переменную volatile, а затем поток B читает ее, все записи из потока A, которые произошли до записи в переменную volatile, "становятся когерентными" по отношению к потоку B (т.е. кэшированные значения переменных, подвергшихся вышеупомянутой записи из потока A, аннулируются в потоке B). Поправьте меня, если я ошибаюсь.

6
задан B T 7 February 2012 в 03:52
поделиться