我什么时候需要在Java中使用AtomicBoolean?

2022-08-31 05:14:29

我如何使用原子布尔值,该类的用途是什么?


答案 1

当多个线程需要检查和更改布尔值时。例如:

if (!initialized) {
   initialize();
   initialized = true;
}

这不是线程安全的。您可以使用以下方法修复它:AtomicBoolean

if (atomicInitialized.compareAndSet(false, true)) {
    initialize();
}

答案 2

这是我做的笔记(来自Brian Goetz的书),可能对你有所帮助

原子XXX类

  • 提供非阻塞比较和交换实现

  • 利用硬件提供的支持(英特尔的 CMPXCHG 指令),当大量线程通过使用这些原子并发 API 的代码运行时,它们的扩展性将比使用对象级监视器/同步的代码好得多。由于Java的同步机制使代码等待,当有大量线程通过关键部分运行时,大量的CPU时间花在管理同步机制本身(等待,通知等)上。由于新的 API 使用硬件级构造(原子变量)以及等待和锁定自由算法来实现线程安全,因此更多的 CPU 时间花在“做事”上,而不是用于管理同步。

  • 它们不仅提供更好的吞吐量,而且还为死锁和优先级反转等活动问题提供了更大的抵抗力。


推荐