ReentrantLock如何保证可重入性?
时间: 2024-05-12 17:11:46 浏览: 114
Java源码解析之可重入锁ReentrantLock
ReentrantLock是通过一个名为ThreadLocal的成员变量来实现可重入性的,该变量为每个线程都存储了一个int变量state,表示当前线程获取到的锁的次数。当线程第一次获取到锁时,state为0,每次重入锁时,state加1。在线程释放锁时,state减1,直到state变为0时,锁被完全释放。同时,ReentrantLock还需要保证可见性,可以通过使用volatile关键字来修饰state变量,保证对所有线程的可见性。这样,当一个线程获取到锁时,就可以根据线程本地存储的state值来判断该线程是否已经获取了锁,避免了死锁的情况。[^1]
下面是一个示例代码,演示了ReentrantLock如何保证可重入性:
```java
import java.util.concurrent.locks.ReentrantLock;
public class LockDemo {
private final ReentrantLock lock = new ReentrantLock();
public void outer() {
lock.lock(); // 第一次获取锁
try {
inner(); // 调用inner方法,继续获取锁
} finally {
lock.unlock(); // 释放锁
}
}
public void inner() {
lock.lock(); // 再次获取锁
try {
// 执行相关操作
} finally {
lock.unlock(); // 释放锁
}
}
}
```
阅读全文