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