AQS是Java并发包中实现锁的核心框架,ReentrantLock基于它通过重写tryAcquire定义获取逻辑;非公平锁优先插队抢锁,公平锁则需检查队列无前驱才尝试获取;state与owner共同支持可重入语义。

AQS(AbstractQueuedSynchronizer)是 Java 并发包中实现锁和同步器的核心框架,ReentrantLock 正是基于 AQS 构建的典型独占锁。它不直接使用 AQS 的 acquire 方法,而是通过重写 tryAcquire 来定义“是否能获取锁”这一关键逻辑,从而实现可重入、公平/非公平等行为。
tryAcquire 是 AQS 独占模式的入口钩子
AQS 的 acquire 流程(如 lock() 调用)会先尝试调用子类实现的 tryAcquire;成功则直接获得锁,失败才进入排队等待。ReentrantLock 把这个判断完全委托给内部的 Sync 子类(FairSync / NonfairSync),由它们各自实现 tryAcquire。
- tryAcquire 返回 true:表示当前线程成功获取同步状态(state 值更新成功),AQS 不再挂起线程
- 返回 false:AQS 将线程包装为 Node 加入同步队列,并可能阻塞
- 该方法必须是**非阻塞、快速失败**的——只做状态检查与 CAS 更新,不涉及等待逻辑
非公平锁的 tryAcquire 实现(NonfairSync)
非公平模式下,每次 lock() 都会先尝试插队(即不管队列是否有等待者,直接抢锁):
- 先用 CAS 尝试将 state 从 0 改为 1;成功则设置 owner 为当前线程,返回 true
- 若 state ≠ 0,检查是否是当前线程重入:如果是,state += 1,返回 true
- 其他情况(别人持有锁且不是重入)→ 返回 false,走 acquire 流程排队
这段逻辑本质就是:允许“闯入”,只要没被占用就抢到,否则看是不是自己之前锁的。
立即学习“Java免费学习笔记(深入)”;
公平锁的 tryAcquire 实现(FairSync)
公平模式多了队列前置检查:即使锁空闲,也要确认「前面没人排队」才允许获取:
- 首先判断同步队列是否为空(hasQueuedPredecessors()),有前驱节点就直接返回 false
- 再执行和非公平相同的 state 判断与重入处理
这个 hasQueuedPredecessors() 是 AQS 提供的工具方法,通过检查 head.next 是否为当前线程来判定是否“队首”,确保 FIFO。
state 和 owner 共同支撑可重入语义
ReentrantLock 没用 AQS 默认的 exclusiveOwnerThread 字段存 owner,而是在 Sync 中维护一个final Thread 类型的变量(比如 exclusiveOwnerThread),配合 volatile int state 记录重入次数:
- 首次获取:state = 1,exclusiveOwnerThread = current
- 重入:state++,owner 不变
- 释放:state--,直到为 0 才真正释放并清空 owner
所以 tryAcquire 里对重入的判断,核心就是 exclusiveOwnerThread == currentThread && state > 0,然后安全地自增 state。


















