Java面试题更新 2026-08-05

请阐述你对 Java 并发包中 AQS(AbstractQueuedSynchronizer)原理的理解,包括其核心设计、同步状态管理、等待队列机制以及典型应用。

系统设计技术原理Java

考察说明

考查对 AQS 框架核心概念和实现机制的理解深度。

回答思路

  1. 【回答框架 1】AQS 是一个抽象同步队列器,依赖一个 volatile int 状态变量表示同步状态,通过内置的 FIFO 等待队列管理未获取锁的线程。子类通过重写 tryAcquire 和 tryRelease 等方法定义状态获取和释放逻辑,AQS 提供模板方法如 acquire 和 release 控制整体流程。
  2. 【回答框架 2】同步状态通过 CAS 操作更新,保证线程安全。获取锁的线程先尝试用 CAS 将状态从 0 改为 1,成功则持有,失败则加入等待队列尾部并进入自旋或阻塞。释放时用 CAS 改回 0,并唤醒队列头部等待线程。
  3. 【回答框架 3】等待队列是基于 CLH 锁的一个变体,每个节点代表一个线程,通过 prev 和 next 指针构建双向链表。线程入队后会在循环中尝试获取锁,根据前驱节点状态决定是否阻塞,实现公平或非公平的竞争策略。支持可中断和超时获取,以及共享模式如 CountDownLatch 和 Semaphore。
  4. 【回答框架 4】典型应用包括 ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch 等。ReentrantLock 通过 AQS 实现可重入和公平性控制;Semaphore 将状态值视为许可数量,获取时减少状态,释放时增加。理解 AQS 是看透这些并发工具的关键。
  5. 【关键点 1】AQS 的核心是 int 状态和 FIFO 等待队列,状态通过 CAS 保证原子性。
  6. 【关键点 2】子类重写 tryAcquire/tryRelease 等方法,AQS 提供 acquire/release 模板方法。
  7. 【关键点 3】等待队列是 CLH 锁变体,双链表结构,支持公平和非公平模式。
  8. 【关键点 4】支持独占和共享两种模式,并支持可中断、超时等高级特性。
  9. 【关键点 5】ReentrantLock 等工具都是基于 AQS 构建。
  10. 【易错点 1】不要将 state 值固定为 0/1,它可能表示许可证数量或重入计数。
  11. 【易错点 2】等待队列不是直接阻塞所有线程,某些情况会自旋,需结合 LockSupport.park 理解。
  12. 【易错点 3】AQS 不能保证业务幂等,只负责同步控制。