1. ReentrantLock 的定位与核心特性
ReentrantLock 是 Java 并发包中基于 AQS(AbstractQueuedSynchronizer)框架实现的可重入互斥锁。与 synchronized 关键字相比,它提供了更灵活的锁控制能力,包括:
- 可中断的锁获取(lockInterruptibly)
- 尝试非阻塞获取锁(tryLock)
- 超时获取锁(tryLock with timeout)
- 公平性选择(公平锁/非公平锁)
- 多条件变量支持(Condition)
在 JDK 1.5 引入时,其性能优于 synchronized,但随着 JDK 对 synchronized 的优化(如偏向锁、轻量级锁等),现在两者性能差异已不明显。选择 ReentrantLock 更多是看中其丰富的锁控制特性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. AQS 框架基础解析
2.1 AQS 核心数据结构
AQS 使用一个 volatile int 类型的 state 表示同步状态,配合 CLH 变体的双向队列管理线程阻塞:
java复制// 同步状态
private volatile int state;
// 队列头节点
private transient volatile Node head;
// 队列尾节点
private transient volatile Node tail;
Node 节点保存了线程引用和等待状态(CANCELLED/SIGNAL/CONDITION/PROPAGATE),通过 prev/next 指针形成队列。
2.2 AQS 的模板方法模式
AQS 定义了获取/释放锁的骨架逻辑,具体同步器只需实现:
java复制protected boolean tryAcquire(int arg) // 尝试获取锁
protected boolean tryRelease(int arg) // 尝试释放锁
protected int tryAcquireShared(int arg) // 共享模式获取
protected boolean tryReleaseShared(int arg) // 共享模式释放
