Замените AtomicBoolean на примитивный тип, когда используются только методы get() и set()?
Мой код содержит некоторые AtomicBoolean
поля. Только get()
а также set()
методы этих полей называются.
Можно ли безопасно заменить типы этих полей на примитивные логические?
Я имею в виду, что операции присваивания и доступа примитивных логических выражений являются атомарными операциями в Java. И с этой точки зрения я не вижу никакой причины использовать AtomicBoolean
в моем случае.
В моем понимании AtomicBoolean
будет иметь смысл только если такие методы, как compareAndSet
используются, которые объединяют сравнение и доступ. Я ошибаюсь по этому поводу? Не могли бы вы объяснить, почему?
3 ответа
Атомные переменные описываются как "лучшие летучие вещества" в Java Concurrency на практике (см. Раздел 15.3). Вот выдержка из этой книги:
Классы атомарных переменных обеспечивают обобщение
volatile
переменные для поддержки атомарных условных операций чтения-изменения-записи.AtomicInteger
представляет собойint
значение и обеспечиваетget
а такжеset
методы с той же семантикой памяти, что и чтение и запись вvolatile int
,
Применительно к вашему делу это означает, что если вы используете только get()
а также set()
методы AtomicBoolean
, они могут быть безопасно заменены на чтение-запись в volatile boolean
,
volatile
необходим, чтобы гарантировать, что все потоки увидят актуальное значение переменной. Вернемся к параллелизму Java на практике (раздел 3.1.4):
Когда поле объявлено
volatile
компилятор и среда выполнения обращают внимание на то, что эта переменная является общей и что операции с ней не должны переупорядочиваться с другими операциями с памятью.Volatile
переменные не кэшируются в регистрах или в кешах, где они скрыты от других процессоров, поэтому чтениеvolatile
Переменная всегда возвращает самую последнюю запись в любой теме.
Можно ли безопасно заменить типы этих полей на примитивные логические?
Простой примитив boolean
это не то же самое, что AtomicBoolean (который обеспечивает атомарный доступ в многопоточной среде).
Но альтернативой безопасной замены может быть использование volatile boolean
который также обеспечил бы атомный доступ, но я предлагаю вам сохранить AtomicBoolean
как есть (потому что он предоставляет дополнительные методы API, в случае, если вы могли бы это сделать в будущем).
Ответ - нет. Вы можете найти причины здесь Почему AtomicBoolean не может быть заменой Boolean?