Java 原子布尔真的实现了原子性吗?

Java 原子布尔真的实现了原子性吗?,java,multithreading,atomicity,Java,Multithreading,Atomicity,我理解AtomicInteger的有效用例,但我对AtomicBoolean如何保证两个操作I的原子性感到困惑更改布尔值“和ii”。在以下经常引用的AtomicBoolean变量atomicInitialized用例中执行“一次性逻辑”例如initialize() if (atomicInitialized.compareAndSet(false, true)) { initialize(); } 此操作将首先将atomicInitialized设置为true(如果为false),然后

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

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

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

从:

原子类主要被设计为 实施非阻塞数据结构和相关基础设施 上课。compareAndSet方法不是 锁定。它仅适用于对象的关键更新被删除时 仅限于一个变量

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

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

从:

原子类主要被设计为 实施非阻塞数据结构和相关基础设施 上课。compareAndSet方法不是 锁定。它仅适用于对象的关键更新被删除时 仅限于一个变量


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

AtomicBoolean是原子的,但不阻塞。我以前没见过这个例子,但是是的,它坏了。它只在处理其中包含的布尔值时提供原子性。。。这与“神奇地”使10行附近的所有内容都原子化无关……这是对
AtomicBoolean
的错误使用,但这并不意味着
AtomicBoolean
本身不能正确实现原子性。AtomicBoolean是原子的,但不是阻塞。我以前没见过这个例子,但是是的,它坏了。它只在处理其中包含的布尔值时提供原子性。。。这与“神奇地”使10行附近的所有内容都原子化无关……这是
AtomicBoolean
的错误用法,但这并不意味着
AtomicBoolean
本身不能正确实现原子性。