线程死锁的原因和解决办法
来源:互联网 发布:乐高ev3大象编程 编辑:程序博客网 时间:2024/05/21 04:00
前言
死锁问题是多线程特有的问题,它可以被认为是线程间切换消耗系统性能的一种极端情况。在死锁时,线程间相互等待资源,而又不释放自身的资源,导致无穷无尽的等待,其结果是系统任务永远无法执行完成。死锁问题是在多线程开发中应该坚决避免和杜绝的问题。
1. 线程死锁的原因
(1)互斥条件:一个资源每次只能被一个线程使用。
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3)不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
2. 死锁的解决办法
如果发生了死锁,那么只要破坏死锁 4 个必要条件之一中的任何一个,死锁问题就能被解决。下面就是对于上面这些必要条件所作出的推想
(1)如果想要打破互斥条件,我们需要允许进程同时访问某些资源,这种方法受制于实际场景,不太容易实现条件;
(2)打破不可抢占条件,这样需要允许进程强行从占有者那里夺取某些资源,或者简单一点理解,占有资源的进程不能再申请占有其他资源,必须释放手上的资源之后才能发起申请,这个其实也很难找到适用场景;
(3)进程在运行前申请得到所有的资源,否则该进程不能进入准备执行状态。这个方法看似有点用处,但是它的缺点是可能导致资源利用率和进程并发性降低;
(4)避免出现资源申请环路,即对资源事先分类编号,按号分配。这种方式可以有效提高资源的利用率和系统吞吐量,但是增加了系统开销,增大了进程对资源的占用时间。
如果我们在死锁检查时发现了死锁情况,那么就要努力消除死锁,使系统从死锁状态中恢复过来。消除死锁的几种方式:
(1)最简单、最常用的方法就是进行系统的重新启动,不过这种方法代价很大,它意味着在这之前所有的进程已经完成的计算工作都将付之东流,包括参与死锁的那些进程,以及未参与死锁的进程;
(2)撤消进程,剥夺资源。终止参与死锁的进程,收回它们占有的资源,从而解除死锁。这时又分两种情况:一次性撤消参与死锁的全部进程,剥夺全部资源;或者逐步撤消参与死锁的进程,逐步收回死锁进程占有的资源。一般来说,选择逐步撤消的进程时要按照一定的原则进行,目的是撤消那些代价最小的进程,比如按进程的优先级确定进程的代价;考虑进程运行时的代价和与此进程相关的外部作业的代价等因素;
(3)进程回退策略,即让参与死锁的进程回退到没有发生死锁前某一点处,并由此点处继续执行,以求再次执行时不再发生死锁。虽然这是个较理想的办法,但是操作起来系统开销极大,要有堆栈这样的机构记录进程的每一步变化,以便今后的回退,有时这是无法做到的。
- 线程死锁的原因和解决办法
- 死锁产生的原因和解决办法
- 死锁产生的原因和解决办法
- 线程死锁的原因和必要条件
- 关于线程死锁的产生、原因和原理
- 线程同步之死锁的原因和解决方法
- 用存储过程查出引起死锁的进程和SQL语句--数据库死锁原因及解决办法
- 死锁的必要条件和死锁的原因
- java线程死锁的简单解释和解决办法
- 中死锁产生的原因及解决办法
- 死锁产生的原因,必要条件及解决办法
- mysql死锁的原因及解决办法
- 死锁的原因和必要条件
- 死锁和产生的原因
- 死锁的原因和必要条件
- 线程的和线程死锁
- 进/线程死锁产生的原因
- 线程发生死锁的条件与原因
- openCV滑动条TrackBar事件实例
- 用Java写归并排序
- 外观模式
- 为什么我们喜欢追逐?
- JAVA面试题
- 线程死锁的原因和解决办法
- 用栈实现迷宫求解Maze
- MYSQL数据库性能优化
- struts文件的上传与下载
- 假设一个班级有5个人,每个人都会有一些共有的信息:姓名 学号 年龄 分数。从终端输入每个人的信息,然后按照分数从高到低排序,将信息打印到终端上。
- java.io.StreamCorruptedException: invalid type code: AC问题解决
- Hadoop2.7.3 mapreduce(二)类型匹配异常解决方案及源码分析
- 实用Jmeter录制复杂web测试脚本
- IdentityHashMap