Java volatile модификатор и синхронизированные блоки - PullRequest
15 голосов
/ 09 июля 2010

Требуется ли модификатор volatile для переменной, к которой обращаются несколько потоков, но только внутри синхронизированных блоков?Если нет, то почему?

Ответы [ 3 ]

11 голосов
/ 09 июля 2010

Вам не нужно использовать volatile внутри synchronized, синхронизированный уже гарантирует правильное поведение для локального кэширования переменных при последовательном использовании (при каждом доступе).

volatile работает с примитивными значениями и может быть хорошим ярлыком для атомарного доступа к примитивному типу.Обратите внимание, что поведение volatile изменилось в JDK 5 с 1.4.

Более подробную информацию можно найти здесь

4 голосов
/ 09 июля 2010

Нет.Когда вы работаете в синхронизированном блоке, все кэшированные переменные синхронизируются при доступе, так как это создает барьер памяти.

Подробнее см. В этом сравнении (с обсуждением) volatile to synchronized .

2 голосов
/ 09 июля 2010

Блоки, которые синхронизируются на одном и том же объекте (или методе), гарантированно не будут выполняться одновременно. Так что , пока вы синхронизируете с одним и тем же объектом , ваша переменная никогда не будет иметь одновременных обращений, поэтому она не требует специальной обработки.

Если ваш доступ не синхронизирован, значит, у вас есть состояние гонки. Создание переменной volatile может быть правильным для некоторых примитивных переменных (я обращаюсь к другим сообщениям для большей информации о volaitle). Если это бесполезно, у вас почти наверняка есть ошибка.

...