定义
可重入锁,也叫递归锁。
“重入”将获取锁的粒度由“调用”转变为“线程”,即当一个线程请求一个未持有的锁,该线程将顺利得到锁并被记录,且将计数值从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对象的锁,避免了死锁问题。
复制代码
1
2
3
4
5
6
7
8
9public class Test{ public synchronized void method1(){ method2(); } public synchronized void method2(){ } }
最后
以上就是奋斗老师最近收集整理的关于Java可重入锁及其如何避免死锁的全部内容,更多相关Java可重入锁及其如何避免死锁内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复