AtomicBoolean通过CAS实现无锁线程安全:先读volatile变量值,再用CPU原子指令cmpxchg比较并交换,成功则更新状态并返回true,失败则返回false,全程无阻塞、无锁竞争。

AtomicBoolean 通过底层 CAS(Compare-And-Swap) 指令实现线程安全的状态切换,不依赖锁,而是靠 CPU 硬件指令保证原子性。
底层 CAS 是怎么工作的
Java 的 AtomicBoolean 在构造时会用一个 volatile boolean 字段(如 value)存储当前状态,并借助 Unsafe.compareAndSetBoolean() 执行 CAS 操作。该操作会:
- 读取当前内存中变量的值(比如是
false) - 比较它是否等于预期值(比如你传入的
false) - 如果相等,就把变量设为新值(比如
true),并返回true - 如果不等,不做修改,直接返回
false
整个过程由 CPU 一条原子指令完成,不会被线程调度打断。
常用方法如何基于 CAS 切换状态
AtomicBoolean 的核心状态切换方法都封装了 CAS 逻辑:
立即学习“Java免费学习笔记(深入)”;
-
compareAndSet(expectedValue, newValue):直接调用 Unsafe 的 CAS,成功返回true,失败返回false -
set(newValue):不检查旧值,直接写入 —— 底层是 volatile 写,不是 CAS,但保证可见性 -
getAndSet(newValue):先读当前值,再用 CAS 尝试设为新值,循环直到成功(自旋),返回旧值 -
lazySet(newValue):写入不保证立即对其他线程可见(延迟写入),适合只写不读的场景
为什么能避免锁,又保证线程安全
因为 CAS 天然无锁(lock-free):
- 多个线程同时调用
compareAndSet(false, true),只有一个能成功(因只有一个线程看到的当前值是false),其余失败后可重试或放弃 - 没有阻塞、没有上下文切换开销,适合高并发低竞争场景
- 注意 ABA 问题:虽然 AtomicBoolean 只有两个状态(
true/false),天然不存在 ABA(无法从 false→true→false 被误判为“没变”),所以无需额外处理
一个典型使用示例
比如实现一个只执行一次的初始化逻辑:
private AtomicBoolean initialized = new AtomicBoolean(false);
public void init() {
if (initialized.compareAndSet(false, true)) {
// 这里只会被一个线程执行
doActualInitialization();
}
}
一旦某个线程把 initialized 从 false 成功设为 true,后续所有线程的 compareAndSet(false, true) 都会返回 false,从而跳过初始化。


















