我理解AtomicInteger的有效用例,但我对AtomicBoolean如何保证,保证两个动作的原子性i。 '更改布尔值'和ii。执行一次性逻辑'例如,在以下经常引用的AtomicBoolean变量用例的atomicInitialized中的initialize():
if (atomicInitialized.compareAndSet(false, true)) {
initialize();
}
此操作首先将atomicInitialized设置为true(如果为false),然后执行intialize(),这是不安全的。它将保证initialize()仅被调用一次,但是第一个线程完成初始化之后,第二个调用getAndSet()的线程不会被延迟。因此,AtomicBoolean虽然在更新布尔值时提供原子性,但并不能真正为整个“if-block”提供原子性。并且必须使用同步/锁定机制来实现完全原子性。因此,上面经常引用的流行用例并不是真正的原子!!
答案 0 :(得分:7)
“atomic”类旨在为单个变量提供线程安全访问和操作。它们不适用于整个块的同步,例如此处的if
块作为示例。
来自java.util.concurrent.atomic
package description:
原子类主要设计为构建块 实施非阻塞数据结构和相关基础设施 类。 compareAndSet方法不是一般的替代方法 锁定。它仅适用于对象的关键更新 局限于一个变量。
要同步整个块,不要仅仅依赖于“原子”类。您必须提供其他同步代码。