AtomicIntegerFieldUpdater 可在不修改类定义前提下为已有 volatile int 字段提供原子更新能力,要求字段为 public/protected/包私有、volatile、非 static、非 final;通过反射+Unsafe 实现 CAS,复用静态 updater 实例,显著降低高并发大批量实例的内存开销。

AtomicIntegerFieldUpdater 能在不改动原有类定义的情况下,为已有类的 volatile int 字段赋予原子更新能力。它不是新建一个原子对象,而是“借用”反射机制,在运行时动态绑定字段并执行 CAS 操作,特别适合高并发、大批量实例的场景。
字段必须满足的硬性条件
使用前必须确保目标字段同时满足以下四点,否则 newUpdater() 会直接抛出 IllegalArgumentException:
- 类型是 int(不能是 Integer)
- 修饰符含 volatile(保证可见性)
- 是 实例变量(不能加 static)
- 访问权限允许反射调用:字段为 public / protected / 包级私有,且调用方类与目标类在同一个包,或调用方是目标类的子类(对 private 字段不可用)
典型使用步骤
三步完成初始化与调用,核心是静态 updater 实例复用:
- 在目标类外部,声明一个 static final 的 AtomicIntegerFieldUpdater 实例,调用 newUpdater(Class, "fieldName") 初始化
- 在目标类中定义符合上述条件的 volatile int 字段(如 stock、score、count)
- 在业务方法中,传入具体对象实例调用 updater 方法,例如 updater.incrementAndGet(obj) 或 updater.compareAndSet(obj, expect, update)
为什么比 AtomicInteger 更省?
当对象数量极大时,内存差异显著:
- 每个 AtomicInteger 对象本身约占用 16 字节(含对象头、value 字段等)
- 而 AtomicIntegerFieldUpdater 不创建新对象,仅复用一个静态 updater,目标字段仍为原始 int(4 字节)
- 管理 100 万个对象时,前者多占约 12MB 内存,后者几乎零额外开销
常用原子操作方法
所有方法都以对象实例为第一参数,体现“更新器绑定字段、作用于实例”的设计逻辑:
- incrementAndGet(obj):原子自增并返回新值
- decrementAndGet(obj):原子自减并返回新值
- compareAndSet(obj, expect, update):CAS 更新,成功返回 true
- getAndAdd(obj, delta):先取旧值,再加 delta 并设新值,返回旧值
- set(obj, newValue):非原子写入(等价于 volatile 写)

















