我是靠谱客的博主 奋斗老师,最近开发中收集的这篇文章主要介绍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对象的锁,避免了死锁问题。

public class Test{
    public synchronized void method1(){
        method2();
    }

    public synchronized void method2(){

    }
}

最后

以上就是奋斗老师为你收集整理的Java可重入锁及其如何避免死锁的全部内容,希望文章能够帮你解决Java可重入锁及其如何避免死锁所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部