生活中的死锁

前言

死锁的定义:在并发计算中,死锁是一种状态,在这种状态下,组中的每个成员等待另一个成员(包括自己)采取行动,例如发送消息或更常见的释放锁。

死锁产生的四个条件:

        1. 互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用

        2. 请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有

        3. 不可剥夺,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放

        4. 循环等待,即存在一个等待队列:P1占有P2需要的资源,P2占有P3需要的资源,P3占有P1需要的资源。这样就形成了一个等待环路。

避免死锁的四种方式:

        1. 破坏互斥使用,比如拷贝一份资源(但由于生产上开销太大,几乎不会采用这种方式)

        2. 破坏请求和保持,一次性申请所有资源

        3. 破坏不可剥夺,设置优先级或者规定时间内无法获取所需资源,主动让出已持有的资源

        4. 破坏循环等待,按一定顺序获取资源

 

事件一

我房间的门锁是这样的,它上锁是不需要钥匙的,只要在里面那头按下那个凸起的按钮,然后把门一关就锁上了。某天早上,刚睡醒准备去上班的我,把钥匙和脑子一起落在了床上。我像往常一样按下按钮,走出房门,用力一拽,只听“砰”的一声。好的,我成功把钥匙锁在里面了。。。要拿到钥匙就必须先打开房门,要打开房门必须先拿到钥匙。噢,出现了,多么典型的死锁!

解决方案

破坏互斥使用,比如拷贝一份资源

原装钥匙放在宿管那里,我平时开门用的是钥匙的副本,一旦发生死锁,还能去宿管那里的借钥匙开门。

 

事件二

最近在办离职手续,HR让我去人才市场开调档函,把我的档案调过去,然后才能办离职证明。当我去到人才市场,人才市场的工作人员告诉我,要拿着离职证明过来才能开调档函。。。耶,又出现了,多么熟悉的死锁!

 

事件三

上周,我手机被我摔坏了,因为急用,就想去万达买一部新的。这时候保安拦住了我,由于广州近期疫情,他让我出示健康码。我说我手机摔坏了,要进去买一部新手机才能出示健康码;他说,最近疫情严重了,要出示健康码才能进去买手机。。。哇,又双叒叕出现了,多么完美的死锁!

解决方案

 破坏不可剥夺,规定时间内无法获取所需资源,主动让出已持有的资源

事件二中,只需跟HR沟通,让她让出持有资源,先把离职证明给我,让我把调档函开出来,再把调档函给她,问题解决。

事件三中,只需跟保安沟通,让他让出持有资源,让我买到新手机,打开健康码给他,问题解决。

 

事件四

办公室只有一台投影仪和一台笔记本电脑。我和小A同时分别参加两个会议,我拿走了投影仪,小A拿走了笔记本。会议开到一半,我发现我还需要用笔记本,此时小A也发现,他会议的后半部分需要用到投影仪。两个会议都卡住了。

解决方案

破坏请求和保持,一次性申请所有资源

我和小A都只拿了会议所需要的一部分资源,所以导致了死锁的发生。假如我先把投影仪和笔记本一次性拿走,那么小A就会把他的会议推后,等到我结束后他再开始,从而避免两个会议都进行不下去。

 

场景五

借用一下哲学家吃饭问题。五个哲学家在一张圆桌上吃面条,每个人左右两边各有一根筷子,必须同时拿到两根筷子才能开始吃面,这时五个哲学家同时拿起了自己右边的筷子,于是谁都吃不到面条,只能巴巴坐着流口水。

解决方案

把筷子全部给它换成叉子,Perfect!!

破坏循环等待,按一定顺序获取资源

把筷子标上序号,每个人必须按序号从小到大拿筷子,于是5号筷子不可能单独被拿到,因为它周围的1号和4号都比它小,避免成环。

 

总结

生活处处是死锁,人生处处有BUG。生活中无处不在的死锁也好,其他BUG也好,有时是挺让人糟心的。然而,尝试把生活中的BUG跟技术联系在一起,突然这些事件就不是那么令人不快的存在了,反而是变得深情款款,熠熠生辉。

 

 

 

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值