可重入锁(Reentrant Lock)是一种支持重复进入的锁机制。它允许同一个线程多次获取同一个锁,而不会导致死锁。
在Java中,可重入锁可以通过 ReentrantLock 类来实现。与传统的synchronized关键字相比,可重入锁提供了更灵活和强大的功能。
使用可重入锁时,线程可以多次获得同一个锁,每次获得锁后计数器会增加。只有当计数器归零时,其他线程才能获得该锁。这样可以确保同一个线程在释放锁之前可以多次进入临界区域。下面是一个使用可重入锁的示例:
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockExample {
private static ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) {
// 线程1获取锁两次
new Thread(() -> {
lock.lock();
try {
System.out.println("Thread 1 acquired the lock");
lock.lock();
try {
System.out.println("Thread 1 re-acquired the lock");
} finally {
lock.unlock(); // 释放锁
}
} finally {
lock.unlock(); // 释放锁
}
}).start();
// 线程2尝试获取锁
new Thread(() -> {
lock.lock();
try {
System.out.println("Thread 2 acquired the lock");
} finally {
lock.unlock(); // 释放锁
}
}).start();
}
}
在这个示例中,线程1获取了锁两次,并成功释放。而线程2则在线程1完全释放锁之前无法获取到锁。
可重入锁的一个主要优点是它提供了公平性选择。你可以选择是否按照先来先服务的顺序分配锁。默认情况下,ReentrantLock 是非公平的,但你可以通过构造函数参数指定为公平锁。
总结一下,可重入锁允许同一个线程多次获得同一个锁,避免了死锁问题,并且提供了更灵活和强大的功能。