Appearance
AQS 到底解决了什么:理解 ReentrantLock、CountDownLatch 的共同底座
很多人第一次听到 AQS,会觉得它离业务很远。但只要你开始接触:
ReentrantLockCountDownLatchSemaphore
其实就已经绕不开它了。
先说结论
AQS 不是一个直接拿来加锁的类,而是一套“同步器实现框架”。
你可以把它先理解成三件事:
- 用一个
state表示同步状态 - 用一个等待队列管理获取失败的线程
- 统一抽象获取、释放、排队、唤醒这套流程
一、为什么需要 AQS
并发同步器很多,但它们有很多共性问题:
- 线程获取资源失败怎么办
- 怎么排队
- 什么时候唤醒后继线程
- 独占和共享模式怎么统一抽象
如果每个同步器都自己手写一遍,复杂度会非常高。
所以 AQS 的意义就在于:
- 把这些共性机制统一沉淀出来
二、AQS 最核心的两个概念
1. state
这是同步状态的核心字段。
不同同步器会赋予它不同含义,例如:
- 锁是否被占用
- 当前重入次数
- 还剩多少许可
- 计数是否归零
2. 等待队列
线程获取资源失败后,不是一直傻转,而是会进入等待队列排队。
这就是 AQS 很关键的一层:
- 把“抢不到资源的线程怎么管理”统一起来
三、AQS 的基本工作流程
可以粗略理解成:
- 线程尝试获取同步状态
- 成功则继续执行
- 失败则进入等待队列
- 前驱节点释放资源后,再唤醒后继节点竞争
这套流程本质上就是:
- 尝试
- 失败入队
- 释放后唤醒
四、为什么说 ReentrantLock、CountDownLatch 都和它有关
因为它们很多底层同步行为都建立在 AQS 提供的框架之上。
例如:
ReentrantLock更偏独占获取CountDownLatch更偏共享唤醒
但底层都复用了:
- 状态管理
- 队列管理
- 线程挂起与唤醒机制
五、AQS 要重点理解什么
如果你不是要手写并发框架,不需要一上来啃所有源码细节。
先理解这三层就够用了:
- 它用
state表示资源状态 - 它用队列保存没抢到资源的线程
- 它定义了一套可复用的获取和释放流程
只要这三件事清楚,很多并发工具的底层思路就没那么抽象了。
六、一个更实用的学习路径
建议按下面顺序理解:
- 先学会用
ReentrantLock - 再理解它为什么需要可重入、等待队列、唤醒机制
- 然后回头看 AQS,会更容易明白它在抽象什么
一句话总结
AQS 的价值不是某个具体功能,而是为各种同步器提供了一套统一骨架。
真正理解它之后,你再看锁、信号量、倒计时器,会更容易抓住它们的共同底层逻辑。