我是靠谱客的博主 奋斗老师,这篇文章主要介绍Java可重入锁及其如何避免死锁,现在分享给大家,希望可以做个参考。

定义

可重入锁,也叫递归锁。

“重入”将获取锁的粒度由“调用”转变为“线程”,即当一个线程请求一个未持有的锁,该线程将顺利得到锁并被记录,且将计数值从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
9
public class Test{ public synchronized void method1(){ method2(); } public synchronized void method2(){ } }

最后

以上就是奋斗老师最近收集整理的关于Java可重入锁及其如何避免死锁的全部内容,更多相关Java可重入锁及其如何避免死锁内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部