Skip to content
Java 并发与锁机制 · 第 4 篇 / 共 9 篇
领域编程与框架
专题Java 专题
当前序列Java 并发与锁机制
阅读位置第 4 篇 / 共 9 篇当前专题第 3 个序列 / 共 10 个序列

AQS 到底解决了什么:理解 ReentrantLock、CountDownLatch 的共同底座

很多人第一次听到 AQS,会觉得它离业务很远。但只要你开始接触:

  • ReentrantLock
  • CountDownLatch
  • Semaphore

其实就已经绕不开它了。

先说结论

AQS 不是一个直接拿来加锁的类,而是一套“同步器实现框架”。

你可以把它先理解成三件事:

  • 用一个 state 表示同步状态
  • 用一个等待队列管理获取失败的线程
  • 统一抽象获取、释放、排队、唤醒这套流程

一、为什么需要 AQS

并发同步器很多,但它们有很多共性问题:

  • 线程获取资源失败怎么办
  • 怎么排队
  • 什么时候唤醒后继线程
  • 独占和共享模式怎么统一抽象

如果每个同步器都自己手写一遍,复杂度会非常高。

所以 AQS 的意义就在于:

  • 把这些共性机制统一沉淀出来

二、AQS 最核心的两个概念

1. state

这是同步状态的核心字段。

不同同步器会赋予它不同含义,例如:

  • 锁是否被占用
  • 当前重入次数
  • 还剩多少许可
  • 计数是否归零

2. 等待队列

线程获取资源失败后,不是一直傻转,而是会进入等待队列排队。

这就是 AQS 很关键的一层:

  • 把“抢不到资源的线程怎么管理”统一起来

三、AQS 的基本工作流程

可以粗略理解成:

  1. 线程尝试获取同步状态
  2. 成功则继续执行
  3. 失败则进入等待队列
  4. 前驱节点释放资源后,再唤醒后继节点竞争

这套流程本质上就是:

  • 尝试
  • 失败入队
  • 释放后唤醒

四、为什么说 ReentrantLock、CountDownLatch 都和它有关

因为它们很多底层同步行为都建立在 AQS 提供的框架之上。

例如:

  • ReentrantLock 更偏独占获取
  • CountDownLatch 更偏共享唤醒

但底层都复用了:

  • 状态管理
  • 队列管理
  • 线程挂起与唤醒机制

五、AQS 要重点理解什么

如果你不是要手写并发框架,不需要一上来啃所有源码细节。

先理解这三层就够用了:

  • 它用 state 表示资源状态
  • 它用队列保存没抢到资源的线程
  • 它定义了一套可复用的获取和释放流程

只要这三件事清楚,很多并发工具的底层思路就没那么抽象了。

六、一个更实用的学习路径

建议按下面顺序理解:

  1. 先学会用 ReentrantLock
  2. 再理解它为什么需要可重入、等待队列、唤醒机制
  3. 然后回头看 AQS,会更容易明白它在抽象什么

一句话总结

AQS 的价值不是某个具体功能,而是为各种同步器提供了一套统一骨架。

真正理解它之后,你再看锁、信号量、倒计时器,会更容易抓住它们的共同底层逻辑。

延伸阅读相关文章优先当前专题,再补跨专题关联。
同一序列 · 顺着当前主线继续读ReentrantLock 实战怎么用适合沿着 JUC、volatile、CAS、AQS 和锁实现这条主线往下看。Java 专题 · Java 并发与锁机制同一序列 · 顺着当前主线继续读StampedLock 怎么理解适合沿着 JUC、volatile、CAS、AQS 和锁实现这条主线往下看。Java 专题 · Java 并发与锁机制同专题其他序列 · Java 类加载与运行时细节对象是在堆上分配还是在栈上逃逸适合把类加载、双亲委派和运行时对象分配放到一起系统看。Java 专题 · Java 类加载与运行时细节同专题其他序列 · Java 类加载与运行时细节双亲委派模型到底解决了什么适合把类加载、双亲委派和运行时对象分配放到一起系统看。Java 专题 · Java 类加载与运行时细节跨专题关联 · 同场景:基础学习缓存穿透治理怎么做更稳适合把 Sentinel、穿透防护、延迟队列和地理位置搜索放在一起看。Redis 专题 · Redis 可用性与热点治理细节跨专题关联 · 同场景:基础学习慢 SQL 治理为什么不能只靠索引适合把大事务、DDL、回填、慢 SQL 治理和归档分层放进一条持续治理主线上看。MySQL 专题 · MySQL 变更治理与数据生命周期
继续阅读Java 并发与锁机制当前序列第 4 篇 / 共 9 篇当前专题第 3 个序列 / 共 10 个序列
往前看
上一篇锁与 CAS 怎么选回到当前序列上一章上一序列Java 集合与容器从第 1 篇开始:Java 集合怎么选
往后看
下一篇ReentrantLock 实战怎么用继续当前序列下一章下一序列Java 线程池与异步编排从第 1 篇开始:线程池参数怎么配

把零散经验整理成可查、可复用、可持续更新的企业级知识门户