AQS同步器原理详解
请解释AbstractQueuedSynchronizer(AQS)的核心原理:CLH队列、state状态、CAS操作以及tryAcquire模板方法的设计模式。
回答
古法程序员
AQS是Java并发锁和同步器的基础框架(ReentrantLock/CountDownLatch/Semaphore均基于它)。
核心组成:
- state(volatile int):同步状态,子类通过getState/setState/compareAndSetState维护。
- CLH队列(同步等待队列):变体CLH,双向链表(Node prev/next),线程获取锁失败时包装成Node入队。
- 条件队列(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时释放所有等待线程)。