更新时间:2023年04月11日11时31分 来源:传智教育 浏览次数:

ReentrantLock实现可重入性的关键是使用了一个计数器来记录当前线程重入的次数,即每当一个线程获取到锁时,它的重入计数器会加1,当这个线程再次请求锁时,它会再次获得锁而不被阻塞,同时重入计数器继续加1。当线程退出锁保护的代码块时,计数器递减,直到计数器降为0时,锁才被完全释放。
下面是一个简单的Java代码演示ReentrantLock的可重入性:
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockDemo {
private ReentrantLock lock = new ReentrantLock();
private int count = 0;
public void increment() {
lock.lock(); // 获取锁
try {
count++;
System.out.println(Thread.currentThread().getName() + " count = " + count);
increment(); // 递归调用,测试ReentrantLock的可重入性
} finally {
lock.unlock(); // 释放锁
}
}
public static void main(String[] args) {
final ReentrantLockDemo demo = new ReentrantLockDemo();
// 创建两个线程,同时调用increment()方法
new Thread(new Runnable() {
public void run() {
demo.increment();
}
}).start();
new Thread(new Runnable() {
public void run() {
demo.increment();
}
}).start();
}
}
在这个例子中,我们创建了一个ReentrantLock对象来保护一个共享资源count,并在increment()方法中获取锁。在increment()方法中,我们递归调用increment()方法来测试ReentrantLock的可重入性。

运行程序后,你会发现两个线程会不断递归调用increment()方法,每个线程会自己维护一个计数器。这就是ReentrantLock的可重入性的体现,每个线程可以重复获取锁,而不会被阻塞。当程序递归调用次数达到一定值时,将会抛出StackOverflowError异常。