gpt4 book ai didi

java - AtomicBoolean 真的实现了原子性吗?

转载 作者:行者123 更新时间:2023-11-29 06:36:57 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

来自java.util.concurrent.atomic package description :

Atomic classes are designed primarily as building blocks for implementing non-blocking data structures and related infrastructure classes. The compareAndSet method is not a general replacement for locking. It applies only when critical updates for an object are confined to a single variable.

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

关于java - AtomicBoolean 真的实现了原子性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19187060/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com