aqs通过模板方法模式解耦同步逻辑与业务逻辑,核心是volatile int state状态和tryacquire/tryrelease等扩展点,acquire/release已封装完整流程,支持独占与共享模式复用同一基础设施,state含义由子类自由定义。

AQS(AbstractQueuedSynchronizer)通过模板方法模式将锁的底层同步逻辑与具体业务逻辑解耦,让开发者只需关注“什么条件下能获取/释放锁”,而不用重复实现队列管理、线程阻塞唤醒、状态更新等繁琐细节。核心在于:AQS 定义了统一的同步框架,把可变部分(如加锁条件)留给子类实现,把稳定部分(如入队、出队、CAS 状态变更)封装在抽象模板方法中。
state 状态 + tryAcquire/tryRelease 是关键扩展点
AQS 内部用一个 volatile int state 表示同步状态(比如 ReentrantLock 里表示重入次数),所有锁行为都围绕这个 state 展开。子类必须实现以下方法:
- tryAcquire(int arg):定义获取锁的逻辑,返回 true 表示成功。例如公平锁需检查队列是否为空且无前驱;非公平锁直接 CAS 尝试抢锁。
- tryRelease(int arg):定义释放锁的逻辑,返回 true 表示完全释放(如重入锁需减到 0 才返回 true)。
- 可选实现 tryAcquireShared / tryReleaseShared(用于 CountDownLatch、Semaphore 等共享模式)。
acquire 和 release 方法已封装完整流程
你调用 Lock.lock() 实际触发的是 AQS 的 acquire() 模板方法,它内部自动完成:
– 先调 tryAcquire,成功则直接返回;
– 失败则创建节点加入同步队列,挂起当前线程;
– 等待被前驱节点唤醒后重试。
同样,unlock() 调用 release(),它会调 tryRelease,成功后唤醒后续等待节点。这些流程无需子类干预,避免了手动处理线程调度和队列操作的错误风险。
支持独占与共享两种模式,复用同一套基础设施
AQS 不区分锁类型,只提供基础队列和状态管理。ReentrantLock 用独占模式(tryAcquire/tryRelease),Semaphore 用共享模式(tryAcquireShared/tryReleaseShared),但都共用 Node 队列、park/unpark、CAS state 更新等能力。这种设计让不同语义的同步器能复用同一套健壮、经过充分测试的底层逻辑。
可组合、可定制,不绑定具体锁语义
子类可以自由决定 state 含义:可能是资源个数(Semaphore)、门闩计数(CountDownLatch)、持有线程标识(ReentrantLock 的 owner thread + count)。AQS 不关心你如何解释 state,只保证状态变更的原子性和等待线程的公平调度。这也意味着你可以基于 AQS 快速实现自定义同步器,比如实现一个带超时的双向锁,或按优先级唤醒的锁。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











