atomicreference通过cas实现引用原子更新,仅保障引用本身线程安全,不保护对象内部状态;依赖unsafe硬件支持,适用于不可变对象或引用切换场景,推荐使用updateandget等内置重试方法。

AtomicReference 通过 CAS(Compare-and-Swap)机制实现对象引用的原子更新,避免锁开销,适合轻量级、高并发的引用变更场景。
理解 AtomicReference 的核心能力
它不保证对象内部状态线程安全,只保证“引用本身”的读、写、更新是原子的。比如 set()、get() 是原子操作;compareAndSet(expected, updated) 在期望值匹配时才替换引用,失败则返回 false,调用方需自行重试。
- 底层依赖 Unsafe 类的 compareAndSwapObject 方法,由 JVM 提供硬件级支持
- 适用于不可变对象或仅需原子切换引用的场景(如状态机、配置切换、无锁栈/队列节点)
- 不能替代 synchronized 或 ReentrantLock 来保护对象内部字段的并发修改
典型用法:CAS 循环更新
以原子方式修改对象状态时,通常采用“读取当前引用 → 计算新对象 → CAS 尝试更新”模式。关键点是每次构造新对象(因引用不可变),并用循环处理 CAS 失败。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如维护一个包含计数和时间戳的容器类,每次 increment 都创建新实例
- 务必在循环内重新 get() 当前值,避免基于过期快照计算
- 注意 ABA 问题是否影响业务逻辑;若敏感,可改用 AtomicStampedReference
配合函数式接口简化更新逻辑
Java 8+ 可使用 updateAndGet 或 accumulateAndGet,把更新逻辑封装为 UnaryOperator 或 BinaryOperator,代码更简洁且线程安全。
- updateAndGet(func):传入当前引用,返回新引用,内部自动循环 CAS
- accumulateAndGet(x, func):类似,但把 x 和当前引用一起参与计算(如合并两个配置对象)
- 这些方法已内置重试机制,比手写循环更可靠,推荐优先使用
与 volatile 引用的区别
volatile 只能保证可见性和禁止重排序,无法保证复合操作(如“读-改-写”)的原子性;AtomicReference 则提供完整的原子更新能力。
- volatile 引用适合“只写一次”或“只读不改”的场景(如单例初始化)
- 需要多次变更引用、且每次变更依赖前值时,必须用 AtomicReference
- 二者都具备 happens-before 关系,但 AtomicReference 额外提供 CAS 等原子操作语义
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










