ReentrantLock原理
时间: 2025-06-10 09:41:39 AIGC 浏览: 29
### Java `ReentrantLock` 工作原理
#### 1. 概述
`ReentrantLock` 是 Java 并发包 `java.util.concurrent.locks` 中提供的一种可重入的互斥锁,支持公平锁和非公平锁两种模式。它提供了比 `synchronized` 更加灵活的锁机制,允许手动控制锁的获取和释放[^3]。
#### 2. 核心特性
- **可重入性**:线程可以多次获取同一把锁而不会发生死锁。每次获取锁时,内部的计数器会递增;每次释放锁时,计数器会递减。当计数器为零时,锁才真正被释放[^3]。
- **公平性和非公平性**:可以通过构造函数指定是否启用公平锁。公平锁按照请求锁的顺序分配锁,而非公平锁允许插队,可能会导致部分线程长期等待[^3]。
- **锁的中断**:`ReentrantLock` 支持在尝试获取锁时响应线程中断,这是 `synchronized` 所不具备的功能。
#### 3. 实现原理
##### 3.1 基于 AQS 的实现
`ReentrantLock` 的核心是基于 `AbstractQueuedSynchronizer`(AQS)框架实现的。AQS 提供了一个 FIFO 队列用于管理线程的等待和唤醒过程[^4]。
- **状态字段 (`state`)**:AQS 使用一个 `volatile int` 类型的状态字段表示锁的状态。对于 `ReentrantLock`,该字段记录了锁的持有次数。如果线程成功获取锁,`state` 会递增;释放锁时,`state` 会递减[^5]。
- **独占模式**:`ReentrantLock` 使用 AQS 的独占模式来实现锁的获取和释放。只有当前线程持有锁时,其他线程才会被阻塞[^4]。
##### 3.2 锁的获取与释放
- **锁的获取**:
- 当线程尝试获取锁时,首先检查 `state` 是否为零。如果为零且线程能够成功 CAS 更新 `state`,则表示线程成功获取锁[^4]。
- 如果 `state` 不为零,线程会进一步检查当前锁是否已经被自己持有。如果是,则递增 `state` 并继续执行[^5]。
- 如果锁被其他线程持有,当前线程会被加入到 AQS 的同步队列中,并进入等待状态[^4]。
- **锁的释放**:
- 线程释放锁时,会递减 `state`。如果 `state` 减至零,则表示锁已被完全释放,此时会唤醒同步队列中的下一个线程[^5]。
- 在释放锁的过程中,`tryRelease` 方法会检查释放锁的线程是否为锁的持有者。如果不是,则抛出异常[^5]。
##### 3.3 公平锁与非公平锁
- **公平锁**:在公平锁模式下,线程严格按照请求锁的顺序获取锁。AQS 的同步队列确保了线程的 FIFO 行为。
- **非公平锁**:非公平锁允许插队。线程在尝试获取锁时,即使队列中有其他线程等待,也可能直接通过 CAS 操作获取锁。
#### 4. 示例代码
以下是一个简单的 `ReentrantLock` 使用示例:
```java
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockExample {
private final ReentrantLock lock = new ReentrantLock();
public void performTask() {
lock.lock(); // 获取锁
try {
System.out.println(Thread.currentThread().getName() + " is performing the task.");
} finally {
lock.unlock(); // 释放锁
}
}
public static void main(String[] args) {
ReentrantLockExample example = new ReentrantLockExample();
Thread t1 = new Thread(example::performTask, "Thread-1");
Thread t2 = new Thread(example::performTask, "Thread-2");
t1.start();
t2.start();
}
}
```
#### 5. 注意事项
- 必须确保在 `finally` 块中释放锁,以避免因异常导致锁未被释放的问题。
- 使用 `ReentrantLock` 时需要显式调用 `lock()` 和 `unlock()` 方法,这可能会增加代码的复杂性[^3]。
阅读全文
相关推荐



















