AtomicBoolean真的实现了原子性吗?

dro*_*ean 1 java multithreading atomicity

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

if (atomicInitialized.compareAndSet(false, true)) {
    initialize();
}
Run Code Online (Sandbox Code Playgroud)

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

rge*_*man 7

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

java.util.concurrent.atomic包装说明:

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

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