Skip to Content
面试题库Locks[面试题] CAS是什么?volatile是什么?AQS的实现原理是什么?

[面试题] CAS是什么?volatile是什么?AQS的实现原理是什么?

📖 知识讲解版 (温故知新)

  • CAS (Compare And Swap):乐观锁的核心机制,包含三个操作数(内存值V,旧预期值A,新值B)。当且仅当 V == A 时,才将 V 更新为 B,否则失败重试(自旋)。存在 ABA 问题。
  • volatile:Java 关键字,保证变量的可见性(修改后立即同步主存,读取时从主存刷新)和有序性(通过插入内存屏障禁止指令重排),但不保证原子性。
  • AQS (AbstractQueuedSynchronizer):构建锁和同步器的框架。核心原理是 volatile 变量(state)+ CAS 机制 + 双向链表(CLH队列)。通过 CAS 修改 state 状态来实现获取锁,获取失败的线程会被封装成 Node 加入同步队列并阻塞。

🎤 面试实战版 (高手逐字稿)

Q:CAS是什么?volatile是什么?AQS的实现原理是什么?

💬 高手逐字稿

这三个概念其实是紧密联系的,我认为它们构成了 Java JUC 并发包的底层基石。

首先是 CAS (Compare And Swap):它是一种乐观锁的无锁并发机制。它在更新数据时,会去比较内存里的当前值和我预期的旧值是否一致,如果一致,就说明这期间没人改过,我就把它更新成新值;如果不一致,就重试(自旋)。它非常高效,但会有 ABA 问题。

其次是 volatile:这是一个轻量级的同步机制。它的核心作用是两个:一是保证可见性,线程修改了它必须立刻刷回主内存,其他线程读取必须从主内存读;二是保证有序性,通过内存屏障防止指令重排。但它不保证像 i++ 这样的原子操作。

最后是 AQS (AbstractQueuedSynchronizer):它是 Java 中像 ReentrantLock、CountDownLatch 这些同步器的底层框架。这时候细节就来了,AQS 的实现原理,其实就是把前面两个概念结合起来了!AQS 内部维护了一个用 volatile 修饰的 state 变量来表示同步状态(可见性有了);然后通过 CAS 来安全地修改这个 state 的值(原子性有了)。如果一个线程用 CAS 修改 state 失败,说明锁被别人拿了,AQS 就会把这个线程封装成一个节点,扔进它内部维护的一个 FIFO 双向链表(CLH同步队列)中去阻塞等待。

所以,理解了 volatile 的可见性和 CAS 的原子性,AQS 的核心逻辑就迎刃而解了。我在看 ReentrantLock 源码的时候,最惊艳的就是这种巧妙的组合。不知道您平时在做技术分享时,是不是也会把这三个点串起来讲?

最后更新于:
⏱️

登录后开始阅读

当前 MVP 版本只开放邮箱密码登录注册。完成登录后即可进入面试题内容。

还没有账号?先去注册