【并发编程】-- 避免死锁

101 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

接着上一篇文章 【并发编程】-- 死锁必要条件、预防死锁

  1. 避免死锁

    如何避免死锁呢?预防死锁是在系统执行前试着打破以上4个条件,而避免死锁却是在系统执行时,每次分配资源前进行资源分配检测,看看是否可能造成死锁,如果不会,那么再继续分配,所以避免死锁相较于预防死锁,性能更好且更灵活。

    ​ 谈到如何避免死锁,这里需要知道著名的死锁避免算法-银行家算法。这个算法其实很简单,描述的是如果你有1000万元,那么如何贷款给借款人的问题,假设有a、b、c3个人向你贷款,a说:“我最多需要400万元,你先给我200万元,后面如果需要,你再给我”。b说:“我最多需要400万元,你先给我100万元,后面如果需要,你再给我。”而c说:“我最多需要800万元,你先给我300万元,后面如果需要,你再给我”。如何给这3个人贷款,才能满足它们的最大借款额度?找到合适的借款顺序是这个算法的核心。

    姓名拥有的钱/万元需要借的钱/万元还需要的钱/万元银行家剩余的钱/万元
    a200400200400
    b100400300
    c300800500

    找到一个借款顺序能保证总有足够的钱借给a、b、c3人,以满足他们预计需要的钱?找到对应的顺序,可以将其称为安全序列。如果先借款给a,然后再借款给b,最后借款给c,这样都能满足其他任意一人的借款。但如果先借给a,a用完并还钱后,还剩余600万元,然后再借给b,b还钱后剩余700万元,最后将钱借给C,C还钱后剩余1000万元。