虫虫的技术博客 技术 生活

Friday, April 19, 2019

死锁产生条件和如何处理死锁

死锁是在计算机系统中,两个或者两个以上的进程(或者线程),在执行过程中由于某些存在竞争的资源没有合理的管理和释放而导致线程阻塞,无法继续执行下去的状态。

图片来自百度

死锁产生的条件
1,资源互斥,资源同时只能被有限的线程占有
2,阻塞不释放,线程申请资源阻塞后,不释放已经持有的资源
3,不可剥夺,线程持有的资源,是不能被其它线程剥夺的,只能由自己使用完了释放
4,循环等待,存在一个资源等待环,

死锁会导致资源无法释放,系统hang住,这毕竟是我们不想看到的现象
在死锁产生之前,我们需预防和避免,主要思想就是破坏产生的条件,下面针对四个条件分别进行破坏~
1,资源互斥,如果资源是可以被无限共享和使用的,那也就不存在死锁的问题了
2,线程申请资源阻塞后,释放已经持有的资源,线程返回失败
3,线程按优先级排序,优先级高的线程可以剥夺优先级低的线程持有的资源
4,申请资源的时候检测,如果此次申请如果能产生环路,则取消此次申请
其它方案
5,一次性请求所有资源
6,资源编号,按顺序申请使用
7,超时释放重试
实际方案中,应该是没有针对剥夺与资源互斥上面下手的

在死锁产生之后,我们需要处理后续的问题
1,检测死锁,终止死锁等待环中的节点
2,重启进程

Java并发编程实战》中谈到,数据库系统在设计的时候考虑到了死锁的监测以及从死锁中恢复,当检测到死锁时,将选择一个事务作为牺牲者,让其它事务继续执行,应用程序可以重新发起被强行中止的事务

对于java程序,无法从死锁中恢复,所以都会在开发阶段避免死锁,在实际应用中,对于已经发生死锁的情况,通常都需要根据进程信息等,先定位到死锁的位置,然后重启来解决当时的问题,再优化死锁产生的位置,达到根治的目的 

0 comments:

Post a Comment

Popular Posts

Copyright © 虫虫的成长历程 | Powered by Blogger Design by PWT | Blogger Theme by NewBloggerThemes.com