atomicinteger 能做到无锁原子性,因其封装 volatile int 并通过 unsafe 调用 cpu 的 cas 指令:先读取当前值,仅当内存值与预期一致时才更新,否则自旋重试,整个过程由硬件保证原子性且不阻塞线程。

Java 中用 AtomicInteger 实现无锁原子自增,核心是调用其 incrementAndGet() 或 getAndIncrement() 方法,底层依赖 CPU 的 CAS(Compare-And-Swap)指令,无需 synchronized 或锁机制。
为什么 AtomicInteger 能做到无锁原子性
AtomicInteger 封装了一个 volatile int,保证可见性;所有修改操作(如自增)都通过 Unsafe 类调用本地 CAS 指令完成。CAS 会先读取当前值,再尝试更新:只有当内存中的值与预期一致时才成功替换,否则重试——整个过程由硬件保证原子性,不阻塞线程。
常用自增方法及区别
两个最常用的自增方法语义不同,选错会影响逻辑:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
incrementAndGet():先自增,再返回新值(类似++i) -
getAndIncrement():先返回当前值,再自增(类似i++)
例如:AtomicInteger counter = new AtomicInteger(0);int a = counter.incrementAndGet(); // a=1,counter=1int b = counter.getAndIncrement(); // b=1,counter=2
在多线程中安全使用示例
直接在共享变量上操作即可,不需要额外同步:
AtomicInteger count = new AtomicInteger(0);
Runnable task = () -> {
for (int i = 0; i
<h3>注意避免常见误区</h3>
<p>虽然自增是原子的,但复合操作仍需小心:</p>
- ❌
if (counter.get() —— “读-判-改”不是原子的,可能引发竞态 - ✅ 改用
updateAndGet或循环 CAS:counter.updateAndGet(v -> v - ⚠️ 不要把它当普通 int 用:不能直接赋值
counter = new AtomicInteger(5)(应调用set(5))
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










