AtomicInteger原子整数
AtomicInteger 原子整数
AtomicInteger 为单个 int 值提供线程安全的原子操作,底层通常依赖 CAS(Compare-And-Set)。它适合计数器、序号和单变量状态更新。
基本操作
代码块收起展开
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 思想
代码块收起展开
boolean updated = counter.compareAndSet(10, 11);CAS 比较“当前值是否仍等于期望值”,相等才写入。失败时调用方可以重试,因此在低竞争场景中常比阻塞锁轻量。
与 volatile 的关系
AtomicInteger 不只是让值可见,还让 incrementAndGet() 等复合读改写操作具有原子性。volatile int count 的 count++ 仍会丢失更新。
使用边界
AtomicInteger 只能保证单个变量的操作。如果余额与流水、库存与订单等多个状态必须一起满足不变量,应使用锁或事务,不能分别放进几个原子变量就认为整体安全。
高竞争统计场景可考虑 LongAdder。它通过分段降低竞争,但 sum() 更适合作为统计结果,不是强一致事务快照。