getAndIncrement返回旧值,incrementAndGet返回新值;二者均通过Unsafe.getAndAddInt的CAS循环实现原子更新,仅return表达式不同,语义分别等价于i++和++i。

getAndIncrement 和 incrementAndGet 都是 AtomicInteger 中基于 CAS 实现的原子自增方法,核心逻辑高度一致,区别仅在于返回值时机。
底层都调用 unsafe.getAndAddInt
两个方法最终都委托给 Unsafe.getAndAddInt(this, valueOffset, 1) 完成原子更新。该方法内部是一个 do-while 循环:
- 先用
getIntVolatile读取当前值 v - 再用
compareAndSwapInt尝试将 v 更新为 v+1 - 失败则重试,直到成功为止
关键差异在 return 表达式
虽然共享同一套 CAS 循环逻辑,但返回值不同:
-
getAndIncrement()直接返回getAndAddInt(...)的结果 —— 即更新前的旧值 -
incrementAndGet()返回getAndAddInt(...) + 1—— 即更新后的新值
源码级对照(JDK 8+)
// getAndIncrement
立即学习“Java免费学习笔记(深入)”;
public final int getAndIncrement() {<br> return unsafe.getAndAddInt(this, valueOffset, 1);<br>}
// incrementAndGet
public final int incrementAndGet() {<br> return unsafe.getAndAddInt(this, valueOffset, 1) + 1;<br>}
实际使用时的语义差异
假设 AtomicInteger 初始值为 5:
- 调用
getAndIncrement()→ 返回 5,内部值变为 6 - 调用
incrementAndGet()→ 返回 6,内部值也变为 6
行为等价于:前者类似 i++(后置递增),后者类似 ++i(前置递增)。


















