Это правда, что volatile
не вызывает блокировку.
Тем не менее, оператор
переменная переменная была лучше, чем синхронизированное ключевое слово, так как она не включала BLOCKING или CONTEXT SWITCHING.
очень спорно и в значительной степени зависит от того, что вы пытаетесь сделать.volatile
не эквивалентен блокировке, и объявление переменной volatile не дает никаких гарантий относительно атомарности операций, в которые входит эта переменная, например, приращение.
Что volatile
делает, это предотвращает компилятор и /или ЦП выполняет переупорядочение команд или кэширование конкретной переменной.Это известно как забор памяти.Этот неприятный небольшой механизм необходим для обеспечения того, чтобы в многопоточной среде все потоки, читающие определенную переменную, имели актуальное представление о ее значении.Это называется видимость и отличается от атомарность .
Атомность может быть гарантирована только в общем случае с помощью замков (synchronized
) или атомарных примитивов.
Что может сбить с толку, так это тот факт, что использование механизмов синхронизации также генерирует неявное ограничение памяти, поэтому объявление переменной volatile, если вы собираетесь только читать / записывать ее внутри synchronized
блоков,избыточный.