Модификатор Java volatile и синхронизированные блоки
Требуется ли переменная, к которой обращаются несколько потоков, но только внутри синхронизированных блоков, нужен изменчивый модификатор? Если нет, то почему?
Ответы
Ответ 1
Вам не нужно использовать volatile
внутри synchronized
, синхронизация уже гарантирует правильное поведение для локального кеширования переменных при неизменном использовании (при каждом доступе).
volatile
работает с примитивными значениями и может быть хорошим ярлыком для атомных обращений к примитивному типу. Обратите внимание, что поведение изменчивости изменилось в JDK 5 с 1.4.
Более подробную информацию можно найти здесь
Ответ 2
Нет. Когда вы работаете в синхронизированном блоке, все кешированные переменные синхронизируются при доступе, поскольку он создает барьер памяти.
Подробнее см. в этом сравнении (с обсуждением) volatile для синхронизации.
Ответ 3
Блоки, которые синхронизируются на одном и том же объекте (или методе), гарантированно не будут выполняться одновременно. Таким образом, пока вы синхронизируете с одним и тем же объектом, ваша переменная никогда не будет иметь одновременный доступ, поэтому ей не требуется специальное обращение.
Если ваши обращения не синхронизированы, у вас есть условие гонки. Создание переменной volatile
может быть верным для некоторых примитивных переменных (я полагаюсь на другие сообщения для лучшей информации о volaitle). Если это не полезно, у вас почти наверняка есть ошибка.