ReentrantLock是Java中的一个独占锁,也是一个可重入的锁。它表示当一个线程获得该锁并再次请求它时,该线程可以再次获得该锁。这种特性对于递归函数非常有用,因为递归函数需要多次获取同一把锁。
ReentrantLock的实现机制依赖于一个volatile变量state和一个线程FIFO队列。当state为0时,表示锁是可获取的,线程可以执行。当state不为0且请求锁的线程不是当前持有锁的线程时,该线程会被放入FIFO队列中并阻塞。当持有锁的线程释放锁后,会唤醒队列中的线程来竞争锁。
使用ReentrantLock时,通常需要创建一个ReentrantLock对象,然后在需要加锁的代码段之前调用lock()方法获取锁,并在finally块中调用unlock()方法释放锁。这样可以确保即使在发生异常的情况下,锁也能被正确释放,避免死锁的发生。
ReentrantLock也提供了公平锁和非公平锁两种创建策略。公平锁表示按照线程请求锁的顺序来分配锁,而非公平锁则不保证这种顺序。默认情况下,ReentrantLock创建的是非公平锁,但在构造函数中可以指定fair参数为true来创建公平锁。