重入锁(ReentrantLock)
重入锁(ReentrantLock),就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。除此之外,该锁还支持获取锁时的公平性和非公平性选择(默认是非公平)。它是一种独占锁。
ReentrantLock与synchronized对比
(1)都是独占锁,synchronized加锁和解锁的过程自动进行。ReentrantLock加锁和解锁的过程需要手动进行
(2)都可重入,synchronized因为加锁和解锁自动进行,不必担心最后是否释放锁;ReentrantLock加锁和解锁需要手动进行,且次数需一样,否则其他线程无法获得锁
(3)synchronized不可响应中断,一个线程获取不到锁就一直等着;ReentrantLock可以响应中断。
(4)synchronized非公平锁
如果使用自定义的独占锁,重复调用lock则会导致线程阻塞(进入死锁状态)。而ReentrantLock在调用lock方法时,已经获取锁的线程能够再次调用lock取得锁而不被阻塞。
响应中断(中断锁):
如果某一线程A正在执行锁中的代码,另一线程B正在等待获取该锁,可能由于等待时间过长,线程B不想等待了,想先处理其他事情,我们可以让它中断自己或者在别的线程中中断它,这种就是可中断锁。
// 不会阻塞
public static void main(String[] args){
ReentrantLock lock = new ReentrantLock();
lock.lock();
System.out.println("第一次上锁");
lock.lock();
System.out.println("第二次上锁");
lock.unlock();
System.out.println("释放第二个锁");
lock.unlock();
System.out.println("释放第一个锁");
}
// 自定义锁线程阻塞
public static<