概述
定义
可重入锁,也叫递归锁。
“重入”将获取锁的粒度由“调用”转变为“线程”,即当一个线程请求一个未持有的锁,该线程将顺利得到锁并被记录,且将计数值从0变为1;当下次同一个线程再次请求这把锁,该线程无需排队,而是直接得到锁,且计数值由1变为2,仅仅是数量上的累加;每次退出一个线程,计数值-1,直到计数值为0,这把锁将被释放。
因此重入锁的原理:当某个线程请求一个由其他线程持有的锁,该线程将被阻塞。
synchronized及ReentainLock
Java中内置锁synchronized及ReentainLock均为可重入锁,不同的是ReentainLock的线程退出需要手动释放,释放不好容易导致计数值永远>1而形成死锁,因此不是非用不可的情况下仍然推荐使用synchronized。
死锁
可重入锁最大的作用是避免死锁
如下:两个方法同时被加锁,如果首先执行method1,则该线程拥有Test对象的锁,但如果synchronized不是可重入锁,当method1方法调用method2,发现method2需要等待method1锁释放,但是method1的执行又必须依赖method2,于是循环等待,形成死锁。
此时由于synchronized是可重入锁,method1调用method2方法时再次申请仍然可以得到Test对象的锁,避免了死锁问题。
public class Test{
public synchronized void method1(){
method2();
}
public synchronized void method2(){
}
}
最后
以上就是奋斗老师为你收集整理的Java可重入锁及其如何避免死锁的全部内容,希望文章能够帮你解决Java可重入锁及其如何避免死锁所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复