AtomicBoolean真的实现了原子性吗?

时间:2013-10-04 17:12:15

标签: java multithreading atomicity

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

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

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

1 个答案:

答案 0 :(得分:7)

“atomic”类旨在为单个变量提供线程安全访问和操作。它们不适用于整个块的同步,例如此处的if块作为示例。

来自java.util.concurrent.atomic package description

  

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

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