1

我了解 AtomicInteger 的有效用例,但我对 AtomicBoolean 如何保证两个操作的原子性感到困惑。'改变布尔值' 和 ii。在以下经常引用的 AtomicBoolean 变量 atomicInitialized 用例中执行“一次性逻辑”,例如 initialize():

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

此操作将首先将 atomicInitialized 设置为 true(如果为 false),然后执行不安全的 intialize()。它将保证 initialize() 只被调用一次,但第二个调用 getAndSet() 的线程不会被延迟,直到第一个线程完成初始化。因此,AtomicBoolean 在更新布尔值时提供原子性并不能真正为整个“if-block”提供原子性,并且必须使用同步/锁定机制来实现完整的原子性。因此,上面经常引用的流行用例并不是真正的原子!

4

1 回答 1

7

“原子”类旨在为单个变量提供线程安全的访问和操作。它们并不意味着同步整个块,例如if您在此处作为示例的块。

java.util.concurrent.atomic包装描述

原子类主要被设计为构建块,用于实现非阻塞数据结构和相关的基础设施类。compareAndSet 方法不是锁定的一般替代品。它仅适用于对象的关键更新仅限于单个变量时。

要同步整个块,不要仅仅依赖“原子”类。您必须提供其他同步代码。

于 2013-10-04T17:16:47.850 回答