atomicinteger通过cas指令实现无锁原子操作,核心是unsafe.compareandswapint等硬件级原子指令配合volatile保证内存可见性,采用“读-算-写-重试”循环完成线程安全自增,避免阻塞但高竞争下可能引发cpu自旋。

AtomicInteger 通过底层 Unsafe 类的 CAS 指令,在硬件层面保证单个变量读-改-写操作的原子性,无需加锁就能实现线程安全的自增、自减等操作。
核心机制:CAS(Compare-And-Swap)
CAS 是一种乐观锁策略,它包含三个操作数:内存位置 V、预期原值 A、新值 B。执行时判断 V 当前值是否等于 A,若相等则将 V 更新为 B,并返回 true;否则不修改并返回 false。
Java 中 AtomicInteger 的 incrementAndGet()、compareAndSet() 等方法最终都调用 Unsafe.compareAndSwapInt(),该方法由 JVM 映射为 CPU 的原子指令(如 x86 上的 cmpxchg),由硬件直接保障原子性。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
关键字段与内存可见性保障
- 内部使用
volatile int value存储实际数值,确保每次读取都从主内存获取最新值,避免线程本地缓存导致的脏读。 - CAS 操作本身既是原子写,也隐含了“读取最新值”的语义,配合 volatile,共同满足 JSR-133 内存模型的 happens-before 规则。
- 注意:volatile 不保证复合操作(如 i++)的原子性,但 AtomicInteger 把整个“读-改-写”封装进一个 CAS 循环中,从而弥补这一缺陷。
CAS 失败后的重试逻辑(自旋)
以 incrementAndGet() 为例:
- 先读取当前值
current; - 计算期望新值
next = current + 1; - 调用
compareAndSet(current, next)尝试更新; - 若失败(说明其他线程已修改过 value),则重新读取最新值,再次尝试,直到成功为止。
这种“读-算-写-重试”循环就是典型的无锁编程模式,没有阻塞和上下文切换开销,但在高竞争场景下可能引发较多 CPU 自旋。
局限性与注意事项
-
ABA 问题:某值从 A 变为 B 又变回 A,CAS 会误判为未被修改。AtomicInteger 因只涉及数值运算,且 Java 中整数对象复用有限(如 -128~127 的 Integer 缓存),实际影响较小;更复杂场景可用
AtomicStampedReference加版本戳解决。 - 只能保证单变量原子性:无法原子地更新多个变量,比如同时增两个计数器需额外同步手段。
-
不适用于复杂逻辑:CAS 适合简单状态变更;若需在更新前做校验、日志或条件分支,应考虑
ReentrantLock或StampedLock。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










