什么时候最好在Java中使用volatile布尔值而不是AtomicBoolean?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (54)

我已经看过SO中的其他volatile和Atomicxxxx问题(包括这个),并且已经阅读了java.util.current.atomic的描述,但我对这些细微差别并不满意。

如果我试图在使用volatile boolean和之间做出决定AtomicBoolean,除了AtomicBoolean提供的原子读取 - 修改 - 写入操作之外是否还存在实际差异?(例如compareAndSet()getAndSet()

假设我有

volatile boolean flag;

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

AtomicBoolean的成本比volatile boolean更高

  • 内存空间
  • 性能受到影响(volatile boolean似乎需要内存屏蔽,AtomicBoolean似乎需要内存屏蔽+根据java.util.current.atomic描述对CAS操作进行一些次要锁定)

我的直觉是只用AtomicBoolean来保证安全,但我想知道是否有任何情况可以使用volatile boolean(例如,如果我有成千上万的实例并且性能是问题)。

提问于
用户回答回答于

基本上所有的东西AtomicBoolean都是一个volatile boolean物体。

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

如果您需要使用,AtomicBooleanFieldUpdater那么会有相当多的性能开销。如果您不打算经常这样做(如attachNIO中的),那也可以。

用户回答回答于

实际观点之间的主要区别在于AtomicBooleanvolatile比较 - 设置操作不是原子的volatile变量。

 volatile boolean b;

 void foo() {
   if( b ) {
     //Here another thread might have already changed the value of b to false
     b = false;
   }
 }

但看到所有的并发写入都是幂等的,并且只能从一个线程读取,这应该不成问题。

扫码关注云+社区