中小企业网站查询,网络搭建赛项承办市赛申报书,页面设计培训学校,百度语音合成wordpress一、什么是死锁
死锁指多个线程在执行过程中#xff0c;因争夺资源造成的一种相互等待的僵局。
进程死锁是指两个或两个以上的进程在执行过程中#xff0c;由于竞争资源或者由于彼此通信而造成的一种阻塞的现象#xff0c;若无外力作用#xff0c;它们都将无法推进下去。…一、什么是死锁
死锁指多个线程在执行过程中因争夺资源造成的一种相互等待的僵局。
进程死锁是指两个或两个以上的进程在执行过程中由于竞争资源或者由于彼此通信而造成的一种阻塞的现象若无外力作用它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁这些永远在互相等待的进程称为死锁进程。线程死锁是指由于两个或者两个以上的线程互相持有对方所需要的资源导致这些线程处于等待状态无法前往执行。
二、死锁的必要条件
互斥条件同一资源同时只能由一个线程读取不可抢占条件不能强行剥夺线程占有的资源请求和保持条件请求其他资源的同时对自己手中的资源保持不放循环等待条件在相互等待资源的过程中形成一个闭环
三、预防死锁
想要预防死锁只需要破坏其中一个条件即可比如使用定时锁、尽量让线程用相同的加锁顺序还可以用银行家算法即可解决死锁问题
破坏互斥条件和不剥夺条件对sychronized来说是JVM底层设定的每个对象都有一个monitor监视器在同步操作中一个线程或进程持有一个对象的monitor后有monitorenter操作同步方法结束或异常时有monitorexit操作。所以我们是破坏不了这个2个条件的如果不是sychronized如通过Lock完成的互斥条件和不剥夺条件就可以更改破坏请求和保持条件常见的操作有加锁顺序指定加锁的顺序或者线程执行的顺序、加锁时限对加锁的对象增加超时限制避免一直占用破坏环路等待条件死锁检测多线程对期望持有的锁对象不能形成相互(环状)依赖的情况。
如上述死锁代码中 线程01持有对象A后去请求持有对象B 线程02持有对象B后去请求持有对象A-------多线程持有的对象A、B是相互依赖的造成死锁 如果是这样线程01持有对象A后去请求持有对象B 线程02持有对象B后去请求持有对象C ------------A、B、C之间没有相互依赖不会死锁 补充
银行家算法 银行家算法是操作系统的经典算法之一用于避免死锁情况的出现。 它最初是为银行设计的因此得名通过判断借贷是否安全然后决定借不借。 在银行中客户申请贷款的数量是有限的每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量在满足所有贷款要求时客户应及时归还。银行家在客户申请的贷款数量不超过自己拥有的最大值时都应尽量满足客户的需要。 用在操作系统中银行家、出借资金、客户就分别对应操作系统、资源、申请资源的进程。 每一个新进程进入系统时必须声明需要每种资源的最大数目其数目不能超过系统所拥有的的资源总量。当进程请求一组资源时系统必须首先确定是否有足够的资源分配给该进程若有再进一步计算在将这些资源分配给进程后是否会使系统处于不安全状态如果不会才将资源分配给它否则让进程等待。