Я рассмотрел другие вопросы volatile vs. Atomicxxxx в SO (включая этот) и прочитал описание java.util.current.atomic, и я не совсем доволен нюансами.
Если я пытаюсь решить между использованием volatile boolean
и AtomicBoolean
, существуют ли практические различия помимо операций атомарного чтения-изменения-записи, предлагаемых AtomicBoolean? (например, compareAndSet()
и getAndSet()
)
Предположим, что
volatile boolean flag;
Затем один или несколько потоков устанавливают флаг (но не очищают его). Если у меня есть один поток, который читает флаг, и если он установлен, выполняет действие, а затем очищает флаг, volatile
соответствует?
Существует ли более высокая стоимость AtomicBoolean, чем volatile boolean, с точки зрения
- объем памяти
- Достижение производительности (
volatile boolean
, похоже, требует фехтования памяти,AtomicBoolean
, как представляется, требует ограждения памяти + некоторая незначительная блокировка операций CAS в соответствии с описанием java.util.current.atomic)
Мой вызов кишки состоит в том, чтобы просто пойти с AtomicBoolean и быть в безопасности, но я хочу понять, есть ли когда-нибудь ситуация вместо volatile boolean
(например, если у меня было тысячи экземпляров их и производительность были проблемой).