一、可重入性
可重入性是指同一个线程可以重复获取同一把锁而不会被锁死。在Java中,synchronized关键字就是一个可重入锁。同样地,ReentrantLock也支持可重入性,下面的代码示例中,线程可以多次获取锁,而不会被阻塞:class ReentrantLockTest {
private ReentrantLock lock = new ReentrantLock();
public void outer() {
lock.lock();
inner();
lock.unlock();
}
public void inner() {
lock.lock();
// do something
lock.unlock();
}
}
在这个示例中,我们可以看到当outer()方法被调用时,它会首先获取锁并调用inner()方法。在inner()方法中,同样会获取锁,这就是可重入性的体现。
二、公平性
公平性是指多个线程在等待同一把锁的时候,锁的获取应该符合FIFO(先进先出)的规则。ReentrantLock提供了公平锁和非公平锁两种功能,在非公平锁的情况下,任何一个处于等待状态的线程都有可能获取到锁,而公平锁则会优先考虑等待时间最久的线程,以保证公平性。下面的代码示例是一个使用公平锁的案例:
class FairLockTest {
private ReentrantLock lock = new ReentrantLock(true);
public void print() {
lock.lock();
try {
// print something
} finally {
lock.unlock();
}
}
}
在这个示例中,ReentrantLock实例被设置为公平锁,每个线程在请求锁的时候,都会被加入到一个FIFO队列中,请求时间最长的线程将具有最高的获取锁的优先级。
三、中断响应
中断响应是指当一个线程正在等待锁,并且另一个线程请求中断时,应该及时响应中断信号并终止等待状态,以避免程序的死锁和阻塞。ReentrantLock的中断响应功能是通过使用ReentrantLock.lockInterruptibly()方法来实现的。下面是一个使用lockInterruptibly()方法的示例:
class InterruptLockTest {
private ReentrantLock lock = new ReentrantLock();
public void print() {
try {
lock.lockInterruptibly();
// print something
} catch (InterruptedException e) {
// handle interrupt
} finally {
lock.unlock();
}
}
}
在这个示例中,当多个线程同时请求锁时,只有一个线程能够成功获取锁,而其他线程将被阻塞。而当其中一个线程请求中断时,等待时间最长的线程将立即响应中断信号,并抛出InterruptedException异常,以避免程序的死锁和阻塞。