AtomicInteger原子整数

AtomicInteger 原子整数

AtomicInteger 为单个 int 值提供线程安全的原子操作,底层通常依赖 CAS(Compare-And-Set)。它适合计数器、序号和单变量状态更新。

基本操作

代码块JAVA · 5 行收起展开
AtomicInteger counter = new AtomicInteger();

int current = counter.incrementAndGet();
int previous = counter.getAndIncrement();
int total = counter.addAndGet(10);
方法含义
get() / set()读取与写入
incrementAndGet()先加一,再返回新值
getAndIncrement()先返回旧值,再加一
addAndGet(delta)增加指定值并返回新值
getAndUpdate(fn)按函数更新并返回旧值
compareAndSet(expect, update)当前值等于期望值时更新

CAS 思想

代码块JAVA · 1 行收起展开
boolean updated = counter.compareAndSet(10, 11);

CAS 比较“当前值是否仍等于期望值”,相等才写入。失败时调用方可以重试,因此在低竞争场景中常比阻塞锁轻量。

与 volatile 的关系

AtomicInteger 不只是让值可见,还让 incrementAndGet() 等复合读改写操作具有原子性。volatile int countcount++ 仍会丢失更新。

使用边界

AtomicInteger 只能保证单个变量的操作。如果余额与流水、库存与订单等多个状态必须一起满足不变量,应使用锁或事务,不能分别放进几个原子变量就认为整体安全。

高竞争统计场景可考虑 LongAdder。它通过分段降低竞争,但 sum() 更适合作为统计结果,不是强一致事务快照。

延伸阅读