aqs通过state变量、fifo队列和模板方法协同实现独占资源管理:state为volatile int,用cas原子操作控制资源状态;acquire流程先调子类tryacquire,失败则入clh队列并自旋park;release成功后唤醒队列中首个signal节点;公平性由tryacquire实现决定。

AQS 通过独占模式管理资源分配,核心在于用 state 变量 + FIFO 队列 + 模板方法 三者协同:线程能否获取资源由子类决定,排队阻塞与唤醒由 AQS 自动完成。
state 变量控制资源占用状态
state 是一个 volatile int,用于表示独占资源的当前状态:
- 值为 0 表示资源空闲,可被任意线程尝试获取
- 值为 1(或更大)通常表示已被某线程持有;在可重入锁中,state 记录加锁次数
- 所有修改都通过 CAS(compareAndSetState)原子操作,避免竞态
acquire 流程自动处理排队与阻塞
调用 acquire(int arg) 后,AQS 执行标准流程:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 先调用子类实现的 tryAcquire(arg),判断当前线程是否能立即获得资源
- 若失败(返回 false),则将当前线程封装为 Node.EXCLUSIVE 节点,加入 CLH 队列尾部
- 节点入队后,线程进入自旋 + park 状态,等待前驱节点释放时唤醒它
release 流程触发后续线程唤醒
调用 release(int arg) 时:
- 先执行子类的 tryRelease(arg),成功后将 state 清零(或减计数)
- 若释放成功,AQS 会检查队列头节点的后继节点
- 找到第一个 waitStatus == SIGNAL 的有效节点,调用 unpark 唤醒其线程
公平性由子类逻辑决定
公平锁和非公平锁的区别不在 AQS 底层,而在 tryAcquire 的实现:
- 非公平锁:直接尝试 CAS 获取 state,成功就抢到,不看队列
- 公平锁:先检查队列是否有前置等待节点,有则放弃抢锁,走排队流程
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










