CAS在计数器场景性能更高,因其用用户态原子指令替代锁调度:避免线程挂起、上下文切换及Monitor争用;无对象头与队列开销;读操作(get)可并行;且获JVM与硬件协同优化。

CAS 在计数器场景下性能更高,核心在于它用纯用户态的原子指令替代了操作系统级的锁调度机制——没有线程挂起、没有上下文切换、也没有 Monitor 争用。
避免线程阻塞与上下文切换
传统加锁(如 synchronized 或 ReentrantLock)在竞争激烈时,失败线程会被挂起,进入操作系统等待队列;后续唤醒需恢复寄存器、栈、调度状态等,一次上下文切换开销通常在几十到上百纳秒。而 CAS 失败后直接重试(自旋),全程停留在用户态,不触发内核介入。100 线程并发 10 万次自增测试中,AtomicInteger.incrementAndGet() 平均耗时仅 25–40ms,而 synchronized 达 85–110ms,差距主要来自这部分调度损耗。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
消除锁对象头与 Monitor 开销
每个被 synchronized 保护的对象都有对象头(包含 Mark Word),锁升级过程涉及偏向锁→轻量级锁→重量级锁的复杂状态管理;ReentrantLock 内部依赖 AQS 队列和 Node 节点分配。这些结构本身就有内存占用和初始化成本。而 AtomicInteger 底层只是一个 volatile int 字段 + Unsafe 的 cmpxchg 指令调用,无额外对象创建、无锁对象头、无队列维护,内存和 CPU 指令路径都更轻量。
天然支持高并发读,不串行化只读操作
计数器场景中,读操作(如 get())远多于写操作。synchronized 对整个临界区加锁,哪怕只是读取 count,也会阻塞其他线程——即使它们也只想读。而 AtomicInteger 的 get() 是普通 volatile 读,无同步块、无锁竞争,多线程可并行执行。这显著提升了读多写少场景下的吞吐量。
JVM 和硬件协同优化充分
- CAS 被 JIT 编译器映射为单条 CPU 原子指令(如 x86 的 cmpxchg),无需函数调用开销
- volatile 字段自带内存屏障(LoadLoad / StoreStore),确保值立即可见,不依赖锁的 happen-before 规则
- JDK 9+ 在部分原子类中已集成 Thread.onSpinWait() 等轻量退避逻辑,缓解高冲突下的空转


















