AtomicLongFieldUpdater 是用于原子更新 volatile long 实例字段的轻量级工具,要求字段非 static、非 final、volatile 修饰且 public 或包内可见;通过 newUpdater 创建 updater 实例后,以目标对象为第一参数调用 getAndIncrement、compareAndSet 等方法。

AtomicLongFieldUpdater 是 Java 并发包中用于对类的 volatile long 类型实例字段 进行原子更新的工具类,它不创建新对象,而是直接操作目标字段,比 AtomicLong 更轻量(避免包装对象开销),但使用上有严格限制。
字段必须是 volatile long 且非 static
这是最核心的前提。Updater 只能更新 被 volatile 修饰的 long 实例变量,不能用于 static 字段、基本类型非 volatile 字段、包装类型(如 Long)或 final 字段。
- ✅ 正确声明:
volatile long count = 0; - ❌ 错误示例:
long count(缺 volatile)、static volatile long count(static 不支持)、final volatile long count(final 不可更新)
正确初始化 Updater 实例
通过 AtomicLongFieldUpdater.newUpdater() 创建,需传入目标类、字段类型(long.class)和字段名(字符串字面量,必须与实际字段名完全一致,且编译期校验)。
- 字段名必须是 public 访问权限(或与 updater 同包,因反射访问依赖包级可见性)
- 推荐用
private static final声明 updater,复用且线程安全 - 示例:
private static final AtomicLongFieldUpdater<myclass> UPDATER = AtomicLongFieldUpdater.newUpdater(MyClass.class, "count");</myclass>
调用原子方法更新字段
获得 updater 实例后,所有操作都以当前对象为第一参数传入:
立即学习“Java免费学习笔记(深入)”;
-
UPDATER.getAndIncrement(obj):获取当前值并 +1 -
UPDATER.compareAndSet(obj, expect, update):CAS 更新(最常用) -
UPDATER.addAndGet(obj, delta):加 delta 并返回新值 -
UPDATER.set(obj, newValue):普通写(等价于 volatile 赋值)
注意:所有方法第一个参数必须是目标实例(不能为 null),否则抛 NullPointerException。
典型使用场景与注意事项
适合高并发下频繁更新某个计数器字段,又希望避免 AtomicLong 对象分配(如高性能日志统计、连接池计数器)。
- 字段必须在构造时已存在(不能延迟初始化为 null)
- 无法用于继承体系中的父类字段(updater 绑定具体类,子类字段需单独定义 updater)
- 不支持 lambda 或方法引用直接捕获字段——必须显式传入对象实例
- 调试时字段值可能因 volatile 语义看起来“跳变”,属正常现象


















