AtomicReference提供对象引用的原子更新,通过CAS机制实现线程安全的compareAndSet操作,适用于无锁编程与共享引用的高效并发控制。

在Java并发编程中,AtomicReference 是 java.util.concurrent.atomic 包提供的一个工具类,用于实现对象引用的原子更新。它适用于需要线程安全地更新某个共享对象引用的场景,而无需使用 synchronized 关键字或显式加锁。
AtomicReference 的基本用法
AtomicReference 可以包装任意类型的对象,提供线程安全的 get 和 set 操作,并支持 compareAndSet(CAS)等原子方法。
创建一个 AtomicReference 实例非常简单:
AtomicReferenceref = new AtomicReference<>("initial");
你可以通过 get() 获取当前值,set() 更新值:
立即学习“Java免费学习笔记(深入)”;
System.out.println(ref.get()); // 输出: initial
ref.set("updated");
System.out.println(ref.get()); // 输出: updated
使用 compareAndSet 实现条件更新
最核心的功能是 compareAndSet(expectedValue, newValue),它会比较当前引用是否等于预期值,如果相等,则原子性地设置为新值,返回 true;否则不修改并返回 false。
这个机制常用于多线程环境下避免竞态条件。例如:
AtomicReferencecounter = new AtomicReference<>(0); Runnable task = () -> { for (int i = 0; i < 1000; i++) { Integer current; Integer newValue; do { current = counter.get(); newValue = current + 1; } while (!counter.compareAndSet(current, newValue)); } }; // 启动多个线程执行任务 Thread t1 = new Thread(task); Thread t2 = new Thread(task); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(counter.get()); // 正确输出 2000
上面的例子中,多个线程安全地递增一个 Integer 对象,利用 CAS 循环确保每次更新都是基于最新值进行的。
适用场景与注意事项
AtomicReference 特别适合以下情况:
但需要注意:
- AtomicReference 只保证引用的原子性,不保证被引用对象内部状态的线程安全。
- 频繁的 CAS 失败会导致自旋开销,影响性能。
- 避免在高竞争场景下长时间循环操作,必要时考虑使用 LongAdder、ConcurrentHashMap 等更高级结构。
基本上就这些。AtomicReference 提供了一种轻量级、高效的对象引用原子更新方式,合理使用可以显著提升并发程序的可读性和性能。关键在于理解其 CAS 机制和适用边界。










