Нужно ли делать AtomicBoolean
также volatile
?
No.
В этом примере executing
объявлено как static final
, поэтому он будет инициализирован один раз во время инициализации класса и безопасно опубликован для любого другого кода, который в нем нуждается.
Это поведение гарантировано, потому что существует происходит-до между завершением инициализации классов ( обычно) и любое последующее использование любой переменной stati c, объявленной классом. Тот факт, что переменная также final
, исключает любые последующие присваивания стату c, которые отрицают происходит-до .
Вам нужно только объявить executing
как volatile
, если что-то могло присвоить ему новое значение после инициализации. Здесь это невозможно без неприятных размышлений. (И JLS заявляет, что если вы сделаете такие вещи, чтобы изменить final
, гарантии модели памяти не применяются.)
Вы получили бы аналогичный эффект, если бы executing
было final
, но поле экземпляра, а не поле static
. Рассуждения немного отличаются, но это также явно упоминается в JLS.
Наконец, синтаксис Java не позволяет комбинировать модификаторы volatile
и final
. Эта комбинация не имеет смысла.