文章插图
4.4 死锁避免
死锁防止方法能够防止发生死锁,但必然会降低系统并发性,导致低效的资源利用率,其中最具有代表性的避免死锁算法是银行家算法 。
1、多个资源的银行家算法
文章插图
上图中有五个进程,四个资源 。左边的图表示已经分配的资源,右边的图表示还需要分配的资源 。最右边的 E、P 以及 A 分别表示:总资源、已分配资源以及可用资源,注意这三个为向量,而不是具体数值,例如 A=(1020),表示 4 个资源分别还剩下 1/0/2/0 。
检查一个状态是否安全的算法如下:
- 查找右边的矩阵是否存在一行小于等于向量 A 。如果不存在这样的行,那么系统将会发生死锁,状态是不安全的 。
- 假若找到这样一行,将该进程标记为终止,并将其已分配资源加到 A 中 。
- 重复以上两步,直到所有进程都标记为终止,则状态时安全的 。
- 如果一个状态不是安全的,需要拒绝进入这个状态 。
- 对资源的分配加以适当限制可防止或避免死锁发生,但不利于进程对系统资源的充分共享 。
- 为每个进程和每个资源指定一个唯一的号码
- Jstack命令
jstack用于生成java虚拟机当前时刻的线程快照 。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待,线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源 。
- JConsole工具
Jconsole是JDK自带的监控工具,在JDK/bin目录下可以找到 。它用于连接正在运行的本地或者远程的JVM,对运行在Java应用程序的资源消耗和性能进行监控,并画出大量的图表,提供强大的可视化界面 。而且本身占用的服务器内存很小,甚至可以说几乎不消耗 。4.5 死锁恢复
- 资源剥夺:剥夺陷于死锁的进程所占用的资源,但并不撤销此进程,直至死锁解除
- 进程回退:根据系统保存的检查点让所有的进程回退,直到足以解除死锁,这种措施要求系统建立保存检查点、回退及重启机制
- 进程撤销:
1、撤销陷入死锁的所有进程,解除死锁,继续运行 。2、逐个撤销陷入死锁的进程,回收其资源并重新分配,直至死锁解除 。可选择符合下面条件之一的先撤销: 1.CPU消耗时间最少者 2.产生的输出量最小者 3.预计剩余执行时间最长者 4.分得的资源数量最少者后优先级最低者
- 系统重启:结束所有进程的执行并重新启动操作系统 。这种方法很简单,但先前的工作全部作废 。
【多线程之死锁详解】
推荐阅读
- 梦见很精致的碗 梦见很多漂亮的碗盘子是什么意思
- 茶之五色
- 为什么很多看起来不是很复杂的网站,都需要大量顶尖高手来开发?
- 人生 幸好有茶
- thinkphp5多语言怎么切换
- 开网店可以赚到钱吗 一般新手开网店能赚多少钱
- 天生发质不好怎么办
- 肝功能阳性是什么意思
- 茶与武侠
- 茶与红尘