Модификатор Java volatile и синхронизированные блоки

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

Подробнее см. в этом сравнении (с обсуждением) volatile для синхронизации.

Ответ 3

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

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