概念
AQS(AbstractQueuedSynchronizer)
是并发包(java.util.concurrent)的核心组件,用于构建锁和同步器(如
ReentrantLock、Semaphore、CountDownLatch 等)。它通过维护一个 CLH 队列 和
同步状态(state) 实现高效的线程协作。
核心设计思想
同步状态(state):一个 volatile int 变量,表示资源的可用数量(如锁是否被持有、信号量剩余许可数)。
CLH队列:管理等待获取资源的线程,队列中的节点(Node)保存线程引用和等待状态。
模板方法模式:AQS 提供基础框架,子类通过实现 tryAcquire/tryRelease 等方法定义具体逻辑
两种同步模式
独占模式(Exclusive):同一时刻仅一个线程能获取资源(如 ReentrantLock)。
公平锁:按照线程在队列中的排队顺序,先到者先拿到锁
非公平锁:当线程要获取锁时,无视队列顺序直接去抢锁,谁抢到就是谁的
共享模式(Shared):允许多个线程同时获取资源(如 Semaphore、CountDownLatch)。
核心要点
状态原子性:通过volatile+CAS保证
队列管理:双向CLH队列+自旋优化
线程调度:LockSupport精确控制阻塞/唤醒