ReentrantLock 重入锁

Posted guoyu1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ReentrantLock 重入锁相关的知识,希望对你有一定的参考价值。

一、Lock接口:

  在Java SE 5之后,并发包中新增了Lock接口及相关实现类来实现锁功能。

 Lock接口和synchronized关键字实现锁的区别:

(1)Lock接口需要显示的获取和释放锁,sychronized是隐式的获取和释放锁。也正因为如此,使得Lock接口拥有了锁获取与释放的可操作性、可中断的获取锁、超时获取锁 等多种synchronized关键字所不具备的同步特性。

例如:一个场景,先获取锁A,然后获取锁B,当B获得后,同时释放A,同时获取锁C。以此类推。这种场景synchronized就不好实现了。

(2)尝试非阻塞的获取锁:当前线程尝试获取锁,若这一时刻没有其他线程获取到该锁,则成功获取并持有锁。

(3)能被中断的获取:获取到锁的线程能够 响应中断,当获取到锁的线程被中断时,中断异常将会被抛出,同时锁会被释放。

(4)超时获取锁:在指定的截止时间之前获取锁,如果截止时间到了仍旧无法获取锁,则返回。

Lock lock = new ReentrantLock();
lock.lock;
try{
}finally{
    lock.unlock();  
}

2、Lock接口常用API

技术图片

二、ReentrantLock重入锁

1、ReentrantLock:支持重进入的锁,即:能够支持一个线程对资源的重复加锁。此外该锁还支持获取锁时的公平和非公平性选择,默认是非公平锁。

  ReentrantLock在调用lock()方法时,已经获取到锁的线程,能够再次调用lock()方法获取锁,而不被阻塞。

 

补充:

锁的公平性:公平性是针对获取锁而言的,如果一个锁是公平的,那么锁的获取顺序就应该符合请求的绝对时间顺序,就是FIFO。

  非公平锁可能使线程“饥饿”,而公平锁需要进行大量的线程切换

 

2、实现机制:

以上是关于ReentrantLock 重入锁的主要内容,如果未能解决你的问题,请参考以下文章

ReentrantLock重入锁

十ReentrantLock重入锁

ReentrantLock可重入锁在我们的代码中。

[图解Java]ReentrantLock重入锁

B9 Concurrent 重入锁(ReentrantLock)

ReentrantLock 重入锁(下)