tryacquire是aqs独占锁的核心钩子,由子类实现,仅原子判断并更新状态:检查state是否为0或可重入,cas修改成功则返回true,否则false;绝不阻塞、不抛异常、不操作队列。

AQS 的 tryAcquire 方法是独占锁实现的核心钩子,由子类重写,决定“当前线程是否能立即获取锁”——它不负责阻塞或唤醒,只做原子性判断和状态更新。
状态检查与 CAS 尝试抢锁
典型逻辑是先读取同步状态(getState()),判断是否允许获取(比如状态为 0 表示无锁);若允许,就用 CAS 原子更新状态。成功则返回 true,失败返回 false。
- 例如 ReentrantLock 非公平模式:直接 CAS 尝试将 state 从 0 改为 1
- 如果是可重入锁,还需检查当前持有线程是否为本线程;是则 state 加 1,也返回 true
- CAS 必须严格使用
compareAndSetState(期望值, 新值),不能先 get 再 set,否则非原子
拒绝锁的常见条件要明确处理
以下情况应直接返回 false,让 AQS 进入排队/阻塞流程:
- 锁已被其他线程占用(state > 0 且当前线程不是 owner)
- 可重入锁的重入次数已达上限(比如 state 已达
Integer.MAX_VALUE) - 有公平性要求且队列非空(公平锁需先检查
hasQueuedPredecessors())
绝不阻塞、不挂起、不调用 park
tryAcquire 是纯非阻塞逻辑:
- 不做
Thread.sleep、LockSupport.park或任何等待操作 - 不抛出异常(除非参数非法,如负数 acquires),正常失败就返回 false
- 不修改 AQS 队列结构(
addWaiter、acquireQueued是 AQS 自己做的事)
返回值语义必须严格遵守
AQS 依赖返回值驱动后续行为:
-
true:获取成功,AQS 不再处理该线程,直接返回 -
false:获取失败,AQS 自动将当前线程构造成节点、加入同步队列、并可能 park - 绝不能返回 null 或其他值;也不能在应失败时返回 true(会导致锁状态错乱)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











