AQS 是什么?
AQS,全称 AbstractQueuedSynchronizer,是 Java 并发包(java.util.concurrent.locks) 的同步器框架基类。
-
它的定位:
一个实现锁和同步器的底层框架,封装了线程状态管理、FIFO 等待队列、阻塞/唤醒机制,让我们只需要关注“资源获取与释放”的逻辑,就能轻松实现各种并发工具(ReentrantLock、Semaphore、CountDownLatch、CyclicBarrier 都基于它)。
-
它自己不是锁,不能直接用,而是被继承来实现各种同步组件。
类的核心定义:
-
state:一个
volatile int,用来表示同步状态(不同同步器自定义含义)- 在 ReentrantLock 中,
state表示锁的重入次数 - 在 Semaphore 中,
state表示当前可用的许可数量 - 在 CountDownLatch 中,
state表示计数器数值
- 在 ReentrantLock 中,
-
FIFO 等待队列(CLH队列) :存放获取资源失败的线程
为什么要有 AQS?
在没有 AQS 之前,如果我们要实现一个线程同步工具(比如自定义锁):
- 需要自己管理等待线程队列
- 需要自己调用 LockSupport.park/unpark 来阻塞或唤醒线程
- 需要自己保证 线程安全、CAS 修改状态、唤醒顺序
这些写法非常复杂、容易出错。
AQS 的作用:
帮我们把这些复杂的通用逻辑打包好,包括:
- 维护同步状态 state
- 队列管理(FIFO)
- 阻塞 / 唤醒线程
我们只需要继承 AQS,重写几个钩子方法(比如 tryAcquire / tryRelease),其他复杂的排队、阻塞、唤醒都交给 AQS 来做。