Когда предпочтительнее использовать volatile boolean в Java, а не AtomicBoolean? [дубликат]

На этот вопрос уже есть ответ здесь:

Я рассмотрел другие вопросы volatile и Atomicxxxx в SO (включая этот ) и прочитал описание java.util.current.atomic , и меня не совсем устраивают нюансы.

Если я пытаюсь выбрать между использованием изменчивое логическое значение и AtomicBoolean , Есть ли практические отличия помимо атомарных операций чтения-изменения-записи, предлагаемых AtomicBoolean? (например, compareAndSet () и getAndSet () )

Предположим, у меня есть

volatile boolean flag;

Затем один или несколько потоков устанавливают флаг (но не сбрасывают его). Если у меня есть один поток, который считывает флаг, и если он установлен, выполняет действие, а затем сбрасывает флаг, достаточно ли volatile ?

Есть ли более высокая стоимость AtomicBoolean, чем volatile boolean, с точки зрения из

  • области памяти
  • снижение производительности ( volatile boolean , похоже, требует ограждения памяти, AtomicBoolean , похоже, требует ограждения памяти + некоторые незначительные блокировки операций CAS согласно java. util.current.atomic description)

Мой внутренний призыв - просто перейти на AtomicBoolean и быть в безопасности, но я хочу понять, есть ли ' Когда-либо возникала ситуация, когда вместо этого использовалось volatile boolean (например, если бы у меня были тысячи их экземпляров и производительность была бы проблемой).

54
задан Community 23 May 2017 в 02:02
поделиться