CAS是为避免悲观锁阻塞开销而设计的乐观无锁机制,核心是compareAndSet(V,A,B)原子操作,用于Atomic包、AQS及ConcurrentHashMap等场景,需警惕ABA、自旋耗时和单变量限制三大问题。

背Java CAS思维导图,不是死记硬背节点名称,而是抓住“为什么需要CAS→它怎么工作→用在哪→有什么坑”这条逻辑线。导图是骨架,理解才是血肉。
CAS的核心动机:为什么不用锁?
先搞懂场景——高并发下,synchronized或ReentrantLock这类悲观锁会导致线程频繁阻塞、上下文切换开销大,尤其在读多写少时得不偿失。CAS提供一种“无锁(lock-free)”的乐观策略:假设冲突少,直接尝试修改,失败再重试。
- 对比记忆:悲观锁像“进门前先敲门等开门”,乐观锁像“推门试试,开着就进,关着就再试一次”
- 关键驱动点:避免阻塞、减少调度开销、适合低竞争场景
CAS的三要素:记住“V A B”这个公式
CAS操作本质是原子指令:compareAndSet(V, A, B),即“如果变量V当前值等于预期值A,就把它更新为B,返回是否成功”。这三者缺一不可:
- V:要操作的变量(通常是volatile修饰的共享变量)
- A:你认为它现在应该是的值(即“期望值”,来自上一次读取)
- B:你想设成的新值
背的时候默念:“比旧值、换新值、返结果”——这是AtomicInteger.incrementAndGet()底层干的事。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
典型应用位置:顺着JUC包结构去记
别孤立背CAS,把它嵌入Java并发工具链里记:
- Atomic包:AtomicInteger、AtomicLong、AtomicReference底层全靠Unsafe.compareAndSwapInt/Long/Object
- AQS框架:ReentrantLock、Semaphore、CountDownLatch的state变更,依赖CAS设置同步状态
- ConcurrentHashMap:数组槽位初始化、Node插入、红黑树转换,大量使用CAS+volatile保障线程安全
必须警惕的三个坑:边背边想“怎么破”
导图里常列的ABA问题、循环时间长、只能保证单变量原子性,不能光记名词,要配解决方案:
- ABA问题:V从A→B→A,CAS误判“没变”。解法:AtomicStampedReference带版本戳,或用对象引用本身做标识(如ConcurrentLinkedQueue用next指针)
- 自旋耗CPU:高竞争下反复重试。解法:部分场景改用锁(如LongAdder分段累加),或加yield()/Thread.onSpinWait()提示调度器
- 只能单变量:无法原子更新两个字段。解法:封装成对象用AtomicReference,或用CAS+重试实现伪原子(如ConcurrentHashMap的replaceNode)
建议每天花10分钟,合上导图,自己画出“CAS动机→原理→API位置→陷阱→对策”这五步简图,画三次基本就刻进脑子了。不复杂但容易忽略。

















