zoukankan      html  css  js  c++  java
  • 50 怎么防止死锁?

    怎么防止死锁?

    答:

    怎么防止死锁

    • 尽量使用 tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),设置超时时间,超时可以退出防止死锁。

    • 尽量使用 Java. util. concurrent 并发类代替自己手写锁。

    • 尽量降低锁的使用粒度,尽量不要几个功能用同一把锁。

    • 尽量减少同步的代码块。

    打破四个必要条件之一

    • 打破互斥条件:改造独占性资源为虚拟资源,大部分资源已无法改造。

    • 打破不可抢占条件:当一进程占有一独占性资源后又申请一独占性资源而无法满足,则退出原占有的资源。

    • 打破占有且申请条件:采用资源预先分配策略,即进程运行前申请全部资源,满足则运行,不然就等待,这样就不会占有且申请。

    • 打破循环等待条件:实现资源有序分配策略,对所有设备实现分类编号,所有进程只能采用按序号递增的形式申请资源。
       

    原文链接: https://blog.csdn.net/syilt/article/details/90576501 (怎么防止死锁)
    原文链接: https://baike.baidu.com/item/死锁/2196938#3 (打破四个必要条件之一)
    原文链接: https://www.iteye.com/blog/uule-2435485 (银行家算法)
     

    一张图一句话明 银行家算法

    银行家算法

    银行家算法是一个避免死锁的著名算法,它是以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。

    一句话:当一个进程申请使用资源的时候,银行家算法通过【先 试探 分配给该进程资源】,然后【通过安全性算法判断分配后的系统是否处于安全状态】,若不安全则试探分配作废,让该进程继续等待。

    当一进程提出资源申请时,银行家算法执行下列步骤以决定是否向其分配资源:

    1)检查该进程所需要的资源是否已超过它所宣布的最大值。

    2)检查系统当前是否有足够资源满足该进程的请求。

    3)系统试探着将资源分配给该进程,得到一个新状态。

    4)执行安全性算法,若该新状态是安全的,则分配完成;若新状态是不安全的,则恢复原状态,阻塞该进程。

    假设资源P1申请资源,银行家算法先试探的分配给它(当然先要看看当前资源池中的资源数量够不够),【若申请的资源数量小于等于Available,然后接着判断分配给P1后剩余的资源,能不能使进程队列的某个进程执行完毕】,【若没有进程可执行完毕,则系统处于不安全状态】(即此时没有一个进程能够完成并释放资源,随时间推移,系统终将处于死锁状态)。

    若有进程可执行完毕,则假设回收已分配给它的资源(剩余资源数量增加),把这个进程标记为可完成,并继续判断队列中的其它进程,若所有进程都可执行完毕,则系统处于安全状态,并根据可完成进程的分配顺序生成安全序列(如{P0,P3,P2,P1}表示将申请后的剩余资源Work先分配给P0–>回收(Work+已分配给P0的A0=Work)–>分配给P3–>回收(Work+A3=Work)–>分配给P2–>······满足所有进程)。

  • 相关阅读:
    yii 引入文件
    CodeForces 621C Wet Shark and Flowers
    面试题题解
    POJ 2251 Dungeon Master
    HDU 5935 Car(模拟)
    HDU 5938 Four Operations(暴力枚举)
    CodeForces 722C Destroying Array(并查集)
    HDU 5547 Sudoku(dfs)
    HDU 5583 Kingdom of Black and White(模拟)
    HDU 5512 Pagodas(等差数列)
  • 原文地址:https://www.cnblogs.com/ynzj123/p/12863028.html
Copyright © 2011-2022 走看看