关于死锁的形成的原因及解决办法

  什么死锁,我们可以认为是僵住了,就是程序卡在某个部分,没法继续向下执行。下面我们来了解一下关于一个线程造成死锁和两个线程造成死锁以及多个线程造成死锁的原因。

一个线程造成死锁的原因:

一个线程造成死锁的原因就是我们在一个加锁的程序中,又再进行一次加锁操作,并且这个锁不是可重入锁就会导致死锁,一个程序的内部加锁,内部的锁在等外部释放锁,外部锁需要走完整个流程才能释放锁,这就导致了我们所说的僵住了这样的情况。

我们想象这样的一样场景,假如上图是你的家,你需要钥匙打开第一道门,这时候你只有一把钥匙,我们假设钥匙不能够拔出来,我们需要钥匙才能开第二门,这时候我们已经用第一把开第一扇门,我们没有钥匙开第二把锁,我们需要拔出钥匙,才能开第二个门,这时候我们就没办法进行下一步操作,就造成了死锁。所以解决单一线程的死锁只需要用一个可重入锁或者不在同一个程序内部进行多次加锁就可以解决问题。

两个线程造成死锁的原因:

我们两个线程在执行程序的时候,互相进行加锁操作,我们可以假设吃饺子这么一个场景,一天我和我朋友一起去吃饭,各点了一份水饺,我喜欢沾醋吃,我朋友喜欢沾酱油吃,我们假设一种极端的情况,这时候我和我朋友同时举起了酱油和醋,我跟我朋友说你放下醋我就放下酱油,我朋友跟我说我放下酱油,就放下醋,两个人互不相让,就僵持住了,这时候我们只需要各退一步就可以解决死锁的问题。

多个线程造成死锁的原因:

谈到多个线程造成死锁就要说到经典的哲学家进餐问题。

圆圈代表一个哲学家,每条直线代表一根筷子,哲学家每天就干两件事情,思考哲学和吃饭,每个人吃饭都需要两根筷子。吃完饭才会放下手中的筷子。我们假设一种极端的情况,突然每个哲学家都想要吃饭,都不思考哲学了,每个人都拿起了左手的筷子,这时候就会发现每个人都只有一根筷子,都没法吃饭,因为大家都没有吃到饭都不想放下筷子,造成了死锁,这时候我们的解决办法是什么呢,我们有序的进行就餐,让一个人先放下筷子,然后旁边的人吃完之后放下筷子,第二个人就能吃了,到了最后,大家都能吃到饭了。

我们发现形成死锁的原因是线程之间陷入了循环等待,我们解决方案只要破坏这种循环等待就可以解决死锁。那我们如何更好的去规避死锁,我们可以减少嵌套锁的时候,把代码写的更简洁一点,可以我们方便观察我们是否嵌套了锁,如果我们实在没有办法需要写大量的复杂的代码,需要涉及锁的嵌套。我们可以让各个线程有序排列,有序的获得锁,就像哲学家进餐一样,大家有序的进行获取锁,就可以有效地规避死锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值