可重入锁为什么能避免死锁?

可重入锁为什么能避免死锁?

我有两个问题:

  1. 我还是不明白,可重入锁为什么能避免死锁?可重入锁就是一个线程在不释放锁的时候可以继续获取锁。老师讲的案例是一个线程的递归方法里面获取锁,多次获取锁,多次释放锁,释放锁的次数和获取锁的次数相等,可以避免死锁。但是死锁是多个(两个及以上的)线程彼此不释放自己的资源,而去试图操作其他线程的资源,形成交叉引用、循环等待。可重入锁是一个线程在一个资源上可以获取多个锁,死锁涉及多个线程的循环等待,我没看出可重入锁和死锁这两个概念有什么关系,我也无法理解为什么可重入锁能避免死锁。请老师给我解释一下可重入锁为什么能避免死锁

  2. 我看到CSDN的博客说,synchronized和ReentrantLock都是可重入锁。我又回顾了阶段一的《多线程的安全与应用》的视频3-6 死锁的产生与解决方法

    既然synchronized也是可重入锁,可重入锁能避免死锁,那为什么这个视频的演示代码使用了synchronized却依然产生了死锁?

    https://img1.sycdn.imooc.com//climg/63ea84870950628300000000.jpg

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小蓝 2023-02-14 13:23:36

同学你好~

1.死锁并不是必须是多个线程之间的,也可以是单线程中递归发生的。死锁的本质是,当一个线程尝试获取锁时,该锁已经被占用,并且由于无法获取目标锁,自身也无法释放已经持有的锁。

死锁最容易理解的形式是前面课程中多个线程之间互相争夺锁的形式,也是目前常见的形式,但并不是唯一的形式。

例如本节课中,递归中自己申请自己的锁,但是该锁被自己占用了,无法被二次申请,也是死锁的形式。

可重入锁解决的正是这种自己申请自己的锁的情况,并不是解决了所有的死锁。

2.如上一条所说,synchronized不能解决多个线程间争夺锁而导致的死锁,可以解决自己申请自己的锁形式的死锁。

祝学习愉快~

  • 提问者 hpr456 #1

    我明白了,谢谢老师。

    2023-02-15 01:26:21
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师