Java面试题更新 2026-08-05

请详细解释 Java 并发中的 AQS(AbstractQueuedSynchronizer),包括其核心原理、关键数据结构、同步状态的管理方式,以及如何基于 AQS 实现自定义同步器?

技术原理Java

考察说明

考察对 Java 并发包核心组件 AQS 的理解深度,包括其设计思想、内部实现机制和实际应用。

回答思路

  1. 【回答框架 1】AQS 是 AbstractQueuedSynchronizer 的缩写,是 Java 并发包中实现锁和同步器的基础框架,如 ReentrantLock、Semaphore、CountDownLatch 等都基于它构建。其核心设计是使用一个 volatile 修饰的 int 类型 state 表示同步状态,并通过内置的 FIFO 队列来完成资源获取线程的排队工作,将线程阻塞和唤醒的细节封装起来。
  2. 【回答框架 2】AQS 提供两种资源访问模式:独占模式和共享模式。独占模式下,同一时刻只有一个线程能获取资源,如 ReentrantLock;共享模式下,多个线程可以同时获取资源,如 Semaphore 和 CountDownLatch。AQS 定义了一套模板方法,子类通过覆盖 tryAcquire、tryRelease、tryAcquireShared、tryReleaseShared 等方法来决定资源获取和释放的具体逻辑。
  3. 【回答框架 3】AQS 采用 CLH 锁队列的变体实现线程的排队与阻塞。获取失败的线程会被包装成 Node 节点并加入队列尾部,通过自旋和 LockSupport.park 阻塞自己,当资源释放时,AQS 会唤醒队列头部等待的线程。为了避免无意义的竞争,AQS 还通过前驱节点的状态来预测后继节点是否需要被唤醒。
  4. 【回答框架 4】基于 AQS 实现自定义同步器较为简单,通常只需实现 state 的获取和释放方法。例如实现一个一次性门闩,可通过覆盖 tryAcquireShared 和 tryReleaseShared 来控制 state 值。AQS 提供了 acquire、release、acquireShared、releaseShared 等模板方法,这些方法内部已实现线程排队和阻塞逻辑。
  5. 【关键点 1】AQS 核心是 volatile int state 和 FIFO 等待队列,通过模板方法模式让子类定义资源获取和释放逻辑。
  6. 【关键点 2】支持独占和共享两种模式,对应不同的获取和释放方法。
  7. 【关键点 3】利用 CAS 操作原子更新 state,保证并发安全。
  8. 【关键点 4】线程阻塞和唤醒由 AQS 管理,使用 LockSupport.park 和 unpark。
  9. 【关键点 5】基于 AQS 可轻松实现各种同步器,如 ReentrantLock、Semaphore、CountDownLatch。
  10. 【易错点 1】容易将 AQS 与 CAS 混淆,AQS 内部使用 CAS 但不等同于 CAS。
  11. 【易错点 2】需要区分公平锁和非公平锁,AQS 本身不保证公平性,由子类实现决定。
  12. 【易错点 3】不可中断的获取锁方式(acquire)与可中断(acquireInterruptibly)方式不同,使用需谨慎。