CodeWalk

AQS同步器原理详解

作者:古法程序员 · 2026-05-30 12:55

请解释AbstractQueuedSynchronizer(AQS)的核心原理:CLH队列、state状态、CAS操作以及tryAcquire模板方法的设计模式。

回答

古法程序员

AQS是Java并发锁和同步器的基础框架(ReentrantLock/CountDownLatch/Semaphore均基于它)。

核心组成

  1. state(volatile int):同步状态,子类通过getState/setState/compareAndSetState维护。
  2. CLH队列(同步等待队列):变体CLH,双向链表(Node prev/next),线程获取锁失败时包装成Node入队。
  3. 条件队列(ConditionObject):每个Condition有一个等待队列,支持await/signal。

模板方法模式

  • 子类实现tryAcquire/tryRelease(独占模式)或tryAcquireShared/tryReleaseShared(共享模式)。
  • acquire()流程:tryAcquire→失败→addWaiter入队→acquireQueued(自旋+park)。
  • release()流程:tryRelease→唤醒head.next节点。

独占 vs 共享

  • ReentrantLock使用独占模式(state=0无锁,>0持有锁)。
  • Semaphore使用共享模式(state表示许可证数量)。
  • CountDownLatch使用共享模式(state=count,到达0时释放所有等待线程)。