AtomicInteger通过CAS机制实现线程安全的原子自增,避免了普通int的“读-改-写”三步非原子问题;incrementAndGet()先增后返,getAndIncrement()先返后增,均保证多线程下计数严格递增不重复。

AtomicInteger 通过底层的 CAS(Compare-And-Swap)机制,保证了自增操作的原子性,无需加锁就能安全地在多线程中执行 incrementAndGet() 或 getAndIncrement() 等操作。
为什么普通 int 不行?
普通 int i++ 在字节码层面包含“读取 → 修改 → 写入”三步,多线程下可能多个线程同时读到相同值,各自加 1 后写回,导致最终只加了一次。而 AtomicInteger 将这三步封装为一个不可分割的硬件级指令(如 x86 的 LOCK XADD),失败时自动重试,确保结果正确。
核心自增方法及区别
常用两个方法,语义和返回值不同:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
-
incrementAndGet():先自增,再返回新值(类似++i) -
getAndIncrement():先返回当前值,再自增(类似i++)
典型使用示例
比如统计请求总数:
立即学习“Java免费学习笔记(深入)”;
public class Counter {
private final AtomicInteger count = new AtomicInteger(0);
public void request() {
// 线程安全地 +1,返回自增后的值
int current = count.incrementAndGet();
System.out.println("当前请求数:" + current);
}
}
多个线程调用 request(),count 的值一定从 1 严格递增到 N,不会重复或丢失。
注意事项
- 仅对单个变量的简单操作(如 ++、--、set、compareAndSet)是原子的;复合逻辑(如“先读再条件更新”)仍需额外同步或使用
updateAndGet等函数式方法 - 高竞争场景下 CAS 可能反复失败,带来一定开销,但通常远优于 synchronized
- 初始化建议显式指定初值(如
new AtomicInteger(0)),避免依赖默认 0 而造成理解偏差


















