java中用atomicinteger实现无锁自增,核心依赖cpu的cas指令,避免synchronized的锁开销;它解决普通int++非原子性问题,提供incrementandget()、getandincrement()等线程安全方法,并支持compareandset()、updateandget()等灵活操作,但仅保证单操作原子性,多步组合仍需额外同步。

Java 中用 AtomicInteger 实现无锁自增,核心是靠底层 CPU 的 CAS(Compare-And-Swap)指令,避免了 synchronized 的重量级锁开销。
为什么用 AtomicInteger 而不是 synchronized?
普通 int 变量在多线程下 ++ 操作不是原子的(读取、加 1、写回三步),容易丢失更新;synchronized 虽安全但有锁竞争和上下文切换成本。AtomicInteger 利用硬件级 CAS 原子指令,在大多数场景下成功一次就能完成自增,失败则重试,无需阻塞线程。
基本用法:incrementAndGet() 和 getAndIncrement()
两者都实现线程安全自增,区别在于返回值:
-
incrementAndGet():先加 1 再返回新值(类似 ++i) -
getAndIncrement():先返回当前值,再加 1(类似 i++)
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
int after = counter.incrementAndGet(); // 返回 1,counter 变为 1
int before = counter.getAndIncrement(); // 返回 1,counter 变为 2
更灵活的操作:compareAndSet() 和 updateAndGet()
当需要条件更新或复合逻辑时,这些方法更适用:
-
compareAndSet(expected, updated):仅当当前值等于 expected 时,才设为 updated,返回是否成功 -
updateAndGet(UnaryOperator<integer>)</integer>:传入一个函数,原子地读取当前值、计算新值、更新并返回新值(比如实现加 5:x -> x + 5) -
accumulateAndGet(int x, IntBinaryOperator op):类似 updateAndGet,但支持任意二元运算(如累加、取最大值等)
例如限制计数不超过 100:
AtomicInteger capped = new AtomicInteger(0);capped.updateAndGet(v -> Math.min(v + 1, 100));
注意事项和常见误区
原子类只保证单个操作的原子性,不等于“所有组合操作都线程安全”:
- 连续调用多个原子方法(如先 get() 再 incrementAndGet())不构成原子块,中间可能被其他线程干扰
- 不要试图用 get() + 非原子计算 + set() 替代原子方法,这会破坏线程安全性
- 高并发下 CAS 失败会自旋重试,极端情况下可能影响性能(但比锁好很多)
- 如果需要更复杂的同步逻辑(如多个变量协同变更),仍需考虑 ReentrantLock 或其他机制
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










