Замените 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?

Другие вопросы по тегам