如何理解死锁?【死锁是什么】【死锁的三个典型情况】【死锁的四个必要条件】【如何破解死锁】

        谈在之前,死锁是一个非常重要的问题,对于这个面试题来说,可讨论的时间大约在半个小时左右。死锁问题是影响程序猿幸福感的非常大的一个杀手,一不小心就可能带走你的年终奖~所以注意啦!

        答主回答可能有不完善的地方,欢迎大家在评论区讨论和指正!如果觉得答主的回答能对你有所启发,请点一个小小的赞!

死锁是什么?

通俗一点的理解是:

    假设此时有一杯奶茶和一个吸管,我和我的假想女朋友都想喝,但是奶茶在她手上,吸管在我手上,假设我们都不乐意给对方提供手上的物品,都在这里僵持,死等对方放手,那么都不放手的情况下都喝不到奶茶~,而这个喝不到奶茶的过程就叫做死锁。

专业一点的回答是:

    死锁是指两个或以上的线程在调度执行过程中,由于产生了资源的竞争或者由于彼此之间出现了通信上的问题而造成的一种阻塞现象,如果不加以干预,这个阻塞将不会停止,则此线程就无法再进行下一步的操作了。

死锁的三个典型情况

  1. 一个线程,两把锁,就是同一个线程对于同一个对象连续加了两次锁,如果锁不可重入,就会产生死锁。  例子:假设现在A同学想去上厕所,他进去了然后锁了门,但是现在时空错乱了他被传送出来了并且失去了记忆,过了一会他又想进去上厕所,但是现在上次锁的门没有开,他就无法进去,这个就是一个线程对于同一个对象加了两次不可重入的锁。
  2. 两个线程两把锁,t1和t2各自针对锁A和锁B加锁,然后尝试获取对方的锁,就会死锁。   例子:文章开头举的我和假想女朋友的例子就是一个典型的22死锁例子,再举一个例子就是某个人把车钥匙锁在了家里,把家门的钥匙锁在了车里,这种情况下两方都无法获取到对应的钥匙,就一直等待,解不开锁。
  3. N个线程M把锁。 (相对于2的一般情况,多个线程多个锁之间互相锁,导致死锁),典型例子大家可以自行搜索哲学家就餐问题,由于篇幅,不在此赘述(面试的时候不要说这个话) 简述哲学家就餐问题‘;有五位沉默的哲学家围坐在一张圆桌旁,他们一生都在吃东西和思考。有五只筷子供他们使用,哲学家需要双手拿到一双筷子之后才能吃饭;吃完后会将筷子放下继续思考。我们假设一种极端情况就是五个哲学家同时拿起了左手的筷子,但是没有人愿意让,所以没有人拿到右手的筷子,每个人都没有办法吃到饭,在干等,着就是一个N个线程M把锁的死锁例子。

死锁的四个必要条件

  • 互斥条件:每个资源都被分配给了一个进程或者资源是可用的(线程1拿到了锁,线程2就得等着)
  • 保持和等待条件:已经获取资源的进程被认为能够获取新的资源(线程1拿到了锁A之后再次尝试获取锁B,A这把锁还是保持的,不会因为获取锁B就把A给释放了)
  • 不可抢占条件:分配给一个进程的资源不能强制的从其他进程抢占资源,它只能由占有它的进程显示释放(线程1拿到了锁之后,必须是由线程1主动释放,线程2不能强行获取锁【不能挖墙脚】)
  • 循环等待:死锁发生时,系统中一定有两个或者两个以上的进程组成一个循环,循环中的每个进程都在等待下一个进程释放的资源。(线程1尝试获取锁A和锁B,线程2尝试获取锁B和锁A。线程1在获取B 的时候等待2释放B,同时线程2在等待线程1释放A)
  • (前三条是锁的基本特性,一般无法改变。4最重要)

如何破解死锁?

        发生死锁时,上面的四种情况必须同时发生。如果其中任意一个条件不会成立,死锁就不会发生。可以通过破坏其中任意一个条件来破坏死锁。

        最简单的方法,同时也是最实用的方法:约定好顺序来执行操作。比如在N个线程M 把锁这个例子中的哲学家就餐问题,我们约定五根筷子从1~5依次编号,ABCDE每位哲学家必须先拿比较小的号再拿比较大的号的筷子此时拿到哲学家A拿了1,B拿到了2,C3,D4,哲学家E此时有1和5可选,但是因为约定的存在他不能拿1,也不能拿5,所以哲学家D现在可以拿到45,吃到了饭,然后释放45,C就可以拿到34,吃完释放34,B23,A12此时E就可以拿到1然后再拿5此时问题解决,死锁问题也就解决了。

        银行家模型其实也可以解决死锁问题,但是由于过程太复杂,成本太高的同时内部代码也有可能出bug,不推荐使用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值