解释重入锁(ReentrantLock)的概念及其工作原理。
在Java中,ReentrantLock是一种实现了重入特性的互斥锁,它是java.util.concurrent.locks包的一部分。”重入”意味着一个线程可以多次获取同一把锁。在某些情况下,这可以提高灵活性,并防止死锁。
ReentrantLock提供了与synchronized关键字相似的同步功能,但比synchronized更加灵活。它提供了更高级的功能,如尝试非阻塞地获取锁(tryLock()),可中断的锁获取操作(lockInterruptibly()),公平锁等。
以下是一个ReentrantLock的简单示例:
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockExample {
private final ReentrantLock lock = new ReentrantLock();
public void doSomething() {
lock.lock(); // 获取锁
try {
// 保护的代码段
} finally {
lock.unlock(); // 释放锁
}
}
}
在这个例子中,doSomething方法使用了ReentrantLock保护了一个代码段,确保在同一时间只有一个线程可以执行这个代码段。
需要注意的是,ReentrantLock不会像synchronized那样,在出现异常或者线程结束时自动释放锁,所以我们需要在finally块中手动释放锁,以避免发生死锁。