可重入锁为什么能避免死锁?
我有两个问题:
我还是不明白,可重入锁为什么能避免死锁?可重入锁就是一个线程在不释放锁的时候可以继续获取锁。老师讲的案例是一个线程的递归方法里面获取锁,多次获取锁,多次释放锁,释放锁的次数和获取锁的次数相等,可以避免死锁。但是死锁是多个(两个及以上的)线程彼此不释放自己的资源,而去试图操作其他线程的资源,形成交叉引用、循环等待。可重入锁是一个线程在一个资源上可以获取多个锁,死锁涉及多个线程的循环等待,我没看出可重入锁和死锁这两个概念有什么关系,我也无法理解为什么可重入锁能避免死锁。请老师给我解释一下可重入锁为什么能避免死锁。
我看到CSDN的博客说,synchronized和ReentrantLock都是可重入锁。我又回顾了阶段一的《多线程的安全与应用》的视频3-6 死锁的产生与解决方法,
既然synchronized也是可重入锁,可重入锁能避免死锁,那为什么这个视频的演示代码使用了synchronized却依然产生了死锁?

正在回答 回答被采纳积分+1
同学你好~
1.死锁并不是必须是多个线程之间的,也可以是单线程中递归发生的。死锁的本质是,当一个线程尝试获取锁时,该锁已经被占用,并且由于无法获取目标锁,自身也无法释放已经持有的锁。
死锁最容易理解的形式是前面课程中多个线程之间互相争夺锁的形式,也是目前常见的形式,但并不是唯一的形式。
例如本节课中,递归中自己申请自己的锁,但是该锁被自己占用了,无法被二次申请,也是死锁的形式。
可重入锁解决的正是这种自己申请自己的锁的情况,并不是解决了所有的死锁。
2.如上一条所说,synchronized不能解决多个线程间争夺锁而导致的死锁,可以解决自己申请自己的锁形式的死锁。
祝学习愉快~
- 参与学习 人
- 提交作业 8788 份
- 解答问题 9886 个
综合就业常年第一,编程排行常年霸榜,北上广深月薪过万! 不需要基础,无需脱产即可学习,只要你有梦想,想高薪! 全新升级:技术栈升级(包含VUE3.0,ES6,Git)+项目升级(前后端联调与功能升级)
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星