Как работает volatile? - PullRequest
       12

Как работает volatile?

9 голосов
/ 23 апреля 2010

Обозначение переменной как volatile в Java гарантирует, что каждый поток увидит значение, которое было записано в него последним, вместо некоторого устаревшего значения. Мне было интересно, как это на самом деле достигается. Выдает ли JVM специальные инструкции, которые очищают кассы процессора или что-то в этом роде?

Ответы [ 2 ]

9 голосов
/ 23 апреля 2010

Из того, что я понимаю, всегда выглядит так, как если бы кэш был очищен после записи, и всегда выглядит так, как будто чтения выполняются прямо из памяти при чтении. В результате поток всегда будет видеть результаты записи из другого потока и (согласно модели памяти Java) никогда не будет кэшировать значение. Однако фактическая реализация и инструкции процессора будут различаться в зависимости от архитектуры.

Это не гарантирует корректность, если вы увеличиваете переменную более чем в одном потоке или проверяете ее значение и предпринимаете какие-либо действия, поскольку, очевидно, нет никакой фактической синхронизации. Как правило, вы можете гарантировать правильное выполнение только в том случае, если в переменную записывается только поток, а все остальные читают.

Также обратите внимание на то, что 64-битная энергонезависимая переменная может считываться / записываться как две 32-битные переменные, поэтому 32-битные переменные являются атомарными при записи, а 64-битные - нет. Одна половина может быть записана раньше другой, поэтому считываемое значение может быть не старым, а новым.

Это довольно полезная страница из моих закладок:

http://www.cs.umd.edu/~pugh/java/memoryModel/

1 голос
/ 23 апреля 2010

То, что происходит, зависит от процессора. Обычно есть некоторая форма инструкций барьера памяти. Очистка всего кэша, очевидно, будет очень дорогой - в оборудовании есть протоколы когерентности кэша.

Также важно то, что некоторые оптимизации не выполняются при доступе к полю. Компилятор важен при рассмотрении многопоточности, а не просто думать об аппаратном обеспечении.

...