Java изменчив и побочные эффекты - PullRequest
5 голосов
/ 07 февраля 2012

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

"переменная типа volatile устанавливает отношение« происходит до »... это привело к изменению. "

У меня проблемы с тем, чтобы обернуть голову вокруг этого. Я понимаю, как работают переменные (в> = Java 5), ​​но мне интересно, как Java решает, какой побочный эффект «привел» к изменению изменчивой переменной.

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

EDIT:

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

Ответы [ 2 ]

4 голосов
/ 07 февраля 2012

Большинство многопроцессорных кэшей имеют механизмы когерентности, поэтому штраф не так плох, как очистка всех кэшей.

Любая запись в потоке, который записывал в volatile до этого, будет видна потоку, читающему volatile после того, как это сделано.

3 голосов
/ 07 февраля 2012

Взять Блокировка с двойной проверкой в качестве примера. Когда вы создаете объект, под одеялом происходит много вещей:

MyClass c=new MyClass();

Память выделена, конструктор вызывается, а ячейка памяти назначается переменной c. JVM разрешено изменить порядок этих действий. Это вызывает проблемы, если выделяется память, назначается значение, а поток прерывает и использует это значение до вызова конструктора.

volatile MyClass c=new MyClass();

Согласно правилам 1.5, присвоение гарантированно будет последним из этих событий. «Побочными эффектами» являются распределение и вызов конструктора.

...