This question already has answers here:
Volatile boolean vs AtomicBoolean

(11个答案)


1年前关闭。




我已经看过SO中的其他volatile与Atomicxxxx问题(包括this one),并阅读了the description of java.util.current.atomic,我对细微差别并不满意。

如果我要决定使用volatile booleanAtomicBoolean之间的区别,除了AtomicBoolean提供的原子读取-修改-写入操作之外,是否还有其他实际区别? (例如compareAndSet()getAndSet())

假设我有
volatile boolean flag;

然后,一个或多个线程设置该标志(但不清除它)。如果我有一个线程读取该标志,并且设置了该标志,则执行一个操作,然后清除该标志,volatile是否足够?

就以下方面而言,AtomicBoolean是否比可变 boolean 值的成本更高?
  • 内存空间
  • 性能受到影响(volatile boolean似乎需要内存防护,AtomicBoolean似乎需要内存防护+根据java.util.current.atomic描述对CAS操作进行一些较小的锁定)

  • 我的直觉是只使用AtomicBoolean并确保安全,但是我想了解是否存在使用volatile boolean的情况(例如,如果我有成千上万的实例,而性能是一个问题)。

    最佳答案

    基本上所有AtomicBoolean都是对象中的volatile boolean

    每个对象的开销很小。可能微不足道,但可能会有更多的内存进入缓存。

    如果您需要使用AtomicBooleanFieldUpdater,那么会产生很多性能开销,如果您不经常使用它(NIO中的attach)也可以。

    关于java - 什么时候在Java中使用volatile boolean 而不是AtomicBoolean更可取? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4876122/

    10-12 21:21