
一、核心执行逻辑CAS 操作包含三个操作数内存地址 V、预期旧值 A、要写入的新值 B。 执行三步原子操作读取内存地址 V 上当前值判断当前值是否等于预期旧值 A两种结果相等说明期间没有其他线程修改把新值 B 写入 V操作成功不相等说明数据被其他线程改动过本次修改失败不写入。通常搭配自旋重试失败后循环再次执行 CAS直到成功。示例实现自增 count获取当前 count10预期 A10计算新值 B11CAS (V,A,B) 若内存还是 10 → 更新为 11 若已经变成 11说明被别的线程改过重试。二、底层实现Java 中 CAS 底层依赖 Unsafe 类提供的 native 方法由 CPU 硬件指令保证原子性compareAndSwapInt()、compareAndSwapLong()依靠 CPU 的cmpxchg 硬件指令一条指令完成比较 交换不会被线程中断天然原子不需要加锁。三、典型使用场景JUC 原子类AtomicInteger、AtomicLong、AtomicReference无锁实现计数synchronized 轻量级锁自旋抢锁底层并发容器ConcurrentHashMap 更新节点、计数器自旋锁、乐观锁自定义实现。四、CAS 三大经典问题1. ABA 问题场景线程 1 读取值 A线程 2 先把 A 改成 B再改回 A线程 1 执行 CAS 时发现还是 A误以为没被修改实际中间发生过改动。 解决版本号机制每次修改带上自增版本比较时同时校验版本。AtomicStampedReference 带版本戳原子引用。2. 自旋消耗 CPU大量线程竞争下CAS 不断循环重试持续占用 CPU空耗资源。 解决限制自旋次数、竞争激烈时降级为重量级锁。3. 只能保证单个变量原子操作无法一次性对多个共享变量做 CAS 原子更新多变量同步还是需要锁。五、CAS 乐观锁 vs synchronized 悲观锁CAS 乐观锁无阻塞不切换内核态竞争少性能高竞争激烈 CPU 消耗大存在 ABA 缺陷synchronized 悲观锁竞争失败线程阻塞挂起释放 CPU内核切换开销大无 ABA 问题。精简总结口述版CAS 是比较并交换的无锁乐观锁基于 CPU 硬件指令保证原子先对比内存值与预期值一致才更新失败自旋重试存在 ABA、CPU 空转、多变量无法原子更新三大问题AtomicInteger、轻量级锁底层都使用 CAS。