我什么时候需要在Java中使用AtomicBoolean?
2022-08-31 05:14:29
我如何使用原子布尔值,该类的用途是什么?
当多个线程需要检查和更改布尔值时。例如:
if (!initialized) {
initialize();
initialized = true;
}
这不是线程安全的。您可以使用以下方法修复它:AtomicBoolean
if (atomicInitialized.compareAndSet(false, true)) {
initialize();
}
这是我做的笔记(来自Brian Goetz的书),可能对你有所帮助
原子XXX类
提供非阻塞比较和交换实现
利用硬件提供的支持(英特尔的 CMPXCHG 指令),当大量线程通过使用这些原子并发 API 的代码运行时,它们的扩展性将比使用对象级监视器/同步的代码好得多。由于Java的同步机制使代码等待,当有大量线程通过关键部分运行时,大量的CPU时间花在管理同步机制本身(等待,通知等)上。由于新的 API 使用硬件级构造(原子变量)以及等待和锁定自由算法来实现线程安全,因此更多的 CPU 时间花在“做事”上,而不是用于管理同步。
它们不仅提供更好的吞吐量,而且还为死锁和优先级反转等活动问题提供了更大的抵抗力。