AtomicIntegerFieldUpdater用于对类中public volatile int字段进行无锁原子更新,避免额外对象分配;要求字段非static、非final,且updater必须在字段所在类或其子类中创建,通过newUpdater获取实例后调用incrementAndGet等方法操作具体对象。

AtomicIntegerFieldUpdater 是 Java 并发包(java.util.concurrent.atomic)中用于**对类的 volatile int 字段进行原子更新**的工具类。它不创建新对象,而是直接操作已有对象的字段,适合在不能修改类定义(比如无法将字段改为 AtomicInteger)但又需要原子性保障的场景下使用。
使用前提:字段必须满足严格条件
要成功使用 AtomicIntegerFieldUpdater,目标字段必须同时满足以下要求:
- 必须是
public volatile int类型(不能是private、protected或包级私有,也不能是非 volatile) - 不能是
static字段(只支持实例字段) - 声明该字段的类,必须与调用
newUpdater()的类相同或为其子类(即 updater 必须在字段所在类或其子类中创建) - 字段名必须以字符串形式传入,拼写错误会在运行时抛
RuntimeException(如IllegalArgumentException)
基本用法:三步完成原子更新
以一个计数器类为例:
public class Counter {
public volatile int count = 0; // ✅ 符合要求:public + volatile + int + 非 static
}
使用步骤如下:
立即学习“Java免费学习笔记(深入)”;
-
1. 创建 updater 实例:通过静态方法
newUpdater()获取,传入类类型、字段名 -
2. 绑定目标对象:所有操作(如
incrementAndGet())都需传入具体对象引用 -
3. 调用原子方法:如
addAndGet()、compareAndSet()、getAndIncrement()等
示例代码:
AtomicIntegerFieldUpdater<Counter> updater =
AtomicIntegerFieldUpdater.newUpdater(Counter.class, "count");
Counter c = new Counter();
updater.incrementAndGet(c); // 原子 +1,返回 1
updater.addAndGet(c, 5); // 原子 +5,返回 6
updater.compareAndSet(c, 6, 10); // 若当前值为 6,则设为 10,返回 true
为什么不用 AtomicInteger?何时选 updater?
AtomicIntegerFieldUpdater 和 AtomicInteger 都提供 int 的原子操作,但定位不同:
-
AtomicInteger是独立对象,适合“把状态封装成原子对象”的设计(如作为成员变量直接持有) -
AtomicIntegerFieldUpdater是“零拷贝”方案:复用已有对象字段,避免额外对象分配,内存更紧凑 - 典型适用场景:
– 已有大量对象实例,字段已是volatile int,但需临时增强原子性
– 框架层(如 Netty、Disruptor)需对用户类字段做无侵入原子操作
– 对 GC 压力敏感,需减少短期对象创建
注意事项和常见陷阱
实际使用中容易踩坑,需特别注意:
-
字段访问修饰符写错:写成
private volatile int count→ 运行时报RuntimeException(提示“must be public”) -
跨类使用 updater:在类 A 外部(如工具类)创建 A.field 的 updater → 报
IllegalArgumentException(除非工具类是 A 的子类) - 误以为线程安全 = 全局一致:updater 只保证单字段操作原子,不保证多字段间逻辑一致性(仍需额外同步)
-
性能并非总是更好:JVM 对
AtomicInteger有深度优化(如内联、锁消除),简单场景下 updater 优势不明显,勿盲目替换



















