1. 从"抢座位"看ReentrantLock的直观理解
想象一下图书馆自习室的场景:当座位资源紧张时,学生们会自发形成排队机制。第一个到达的人会占据座位,后续到达的人会在登记表上依次签名排队。这就是ReentrantLock最朴素的工作原理——通过队列管理对共享资源的访问请求。
在Java并发编程中,ReentrantLock提供了比synchronized更灵活的锁机制。其核心特性包括:
- 可重入性:已经持有锁的线程可以重复获取同一把锁(类似学生可以多次进出已占座位)
- 公平性选择:支持先到先得的公平模式和非公平的竞争模式
- 条件变量:可通过Condition实现精细化的线程等待/唤醒机制
关键区别:synchronized是JVM内置的互斥原语,而ReentrantLock是用Java代码实现的锁工具类,这种实现方式使其具备更好的可扩展性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 锁的获取:非公平与公平模式对比
2.1 非公平锁的"插队"机制
在非公平模式下(默认模式),新来的线程可以直接尝试获取锁,而不必立即进入等待队列。这种设计源于一个重要的性能优化考量:减少线程挂起和唤醒的开销。
java复制// ReentrantLock非公平锁获取源码片段
final boolean nonfairTryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
if (compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0) // overflow
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
这段代码揭示了两个关键点:
- 通过CAS(Compare-And-Swap)操作尝试直接获取锁
- 重入计数通过state变量维护(每次重入state+1)
2.2 公平锁的严格排队
公平模式下,hasQueuedPredecessors()方法会检查队列中是否有更早的等待者:
java复制public fi
