atomicinteger 通过 cpu 的 cas 指令实现无锁原子自增,incrementandget() 先增后返、getandincrement() 先返后增、addandget() 加指定值后返新值,适用于计数器等单变量场景,不支持多变量复合操作。

Java 中使用 AtomicInteger 实现多线程自增的无锁原子性,核心在于它底层借助 CPU 提供的 CAS(Compare-And-Swap)指令,避免了 synchronized 或 Lock 带来的阻塞开销。
为什么 AtomicInteger 能保证自增原子性
AtomicInteger 的 incrementAndGet() 方法不是简单地读+改+写,而是以一个不可分割的硬件级操作完成:先读取当前值,再尝试将“旧值 + 1”写入内存,仅当内存中值仍等于读到的旧值时才成功;若期间被其他线程修改过,就重试直到成功。这个过程无需加锁,也没有线程挂起,属于典型的乐观锁策略。
常用自增方法及区别
以下三个方法都保证原子性,但语义和返回值不同:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
incrementAndGet():先自增,再返回新值(如原值为 5,调用后返回 6) -
getAndIncrement():先返回当前值,再自增(如原值为 5,调用后返回 5,内部值变为 6) -
addAndGet(int delta):加指定数值后返回新值(如addAndGet(2)相当于 +=2)
典型使用场景与注意事项
适合计数器、序列号生成、统计类指标等无需复杂同步逻辑的场景。但要注意:
- 它只保证单个变量的原子操作,不适用于多个变量的复合操作(比如“先检查再更新”需额外同步)
- 高并发下 CAS 失败会自旋重试,极端情况下可能带来 CPU 消耗,但一般业务场景影响极小
- 初始化建议用
new AtomicInteger(0)或指定初值,避免误用默认构造导致逻辑偏差
一个简洁示例
模拟 10 个线程各执行 1000 次自增:
AtomicInteger counter = new AtomicInteger(0);
List<thread> threads = new ArrayList();
for (int i = 0; i {
for (int j = 0; j {
try { t.join(); } catch (InterruptedException e) { }
});
System.out.println(counter.get()); // 稳定输出 10000
</thread>
不复杂但容易忽略:只要操作目标是单一 AtomicInteger 实例,且只用它的原子方法,就不需要额外加锁。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










