java死锁详解
进程死锁及解决办法:
一:死锁的概念:
死锁是进程死锁的简称
什么是死锁:
死锁是指多个进程循环等待他方占有的资源而无限的僵持下去的局面。很显然,没有外力作用,那么死锁涉及到的各个进程都将永远处于>封锁状态。计算机系统产生死锁的根本原因就是资源有限且操作不当。即为:一种原因是系统提供的资源太少了,远不能满足并发进程对资源的需求。这种竞争资源>引起的死锁是我们将要讨论的核心。例如:一种临时性资源。某一时刻,进程A等待进程B发来的信息,进程B等待进程C发来的信息,而进程C又等待进程A发来的信息>。信息未到,A、B、C三个进程均无法向前推进,也会发生进程通信上的死锁。另一种原因是进程推进顺序不合适而引发的死锁。资源少也未必一定产生死锁。就如同
两个人过独木桥,如果两个人同时过必然会竞争资源而产生死锁。
产生死锁的四个必要条件:
1,互斥条件:即为某个资源在一段时间内只能由一个进程占有,不能同时被两个或者两个以上的进程占有。
2,不可抢占条件:进程所获得的资源在未使用完毕之前,资源申请者不能强行从资源占有者手中夺取资源,而只能由该资源占有者自行释放。
3,占有且申请条件:进程至少已经占有一个条件,但又申请新的资源;由于该资源已被另外进程占有,此时该进程阻塞;但是,他在等待新的资源之时,
仍然继续占有已占用的资源。
4,换路等待:存在一个进程等待序列{P1,p2,..,pn}其中P1等待P2所占有的资源,P2等待P3占有的资源,.....,而Pn等待P1所占有的资源,形成一个
进程循环等待环。
上面我们说这四个条件在死锁时会同时发生。也就是说,只要有一个辟谣条件不满足,则死锁就可以排除。
二:死锁的预防:
一般的,解决死锁的方法分为死锁的预防,避免,检测与恢复三种。
死锁的预防是保证系统不进入死锁状态的一种策略。它的基本思想就是要求进程申请资源时遵循某种协议,从而打破产生死锁的四个必要条件中的>一个或者多个,保证系统不会进入死锁状态。
1)打破互斥条件。即为允许进程同时访问某些资源。
2)打破不可抢占条件。即为允许进程强行从占有者那里夺取某些资源。
3)打破占有且申请条件。即为可以实行资源预分配策略。
缺点:
1,在许多情况下,进程在执行之前不可能知道它所需要的全部资源。
2,资源利用率低。
3,降低了进程的并发性。
4)打破循环等待条件,实行资源有序分配策略。
缺点:
1,限制了进程对资源的请求
2,为了遵循按编号申请的次序,暂不使用的资源也需要提前申请,从而增加了进行对资源的占用时间。
三: 死锁的避免:
对进程发出的每一个申请资源命令加以动态的检查,并根据检查结果决定是否进行资源分配。就是说,在资源分配的过程中若预测有发生死锁的可>能性,则加以避免。这种方法的关键是确定资源分配的安全性。
1,安全序列:
所谓系统是安全的,是指系统中的所有进程能够按照某一种次序分配资源,并且依次的运行完毕,这种进程序列{P1,P2,..,Pn}就是安全序
列。安全序列是这样组成的:若对于每一个进程Pi,它需要的附加资源可以被系统中当前可用资源加上所有进程Pj当前占有资源之和所满足,则{P1,P2,...,Pn}为一个
安全序列,这时系统处于安全状态,不会进入死锁状态。
2,银行家算法:
银行家算法就是从当前状态出发,逐个按安全序列检查各客户谁能完成其工作,然后嘉定其完成工作且归还全部贷款,再检查下一个能完>成工作的客户,....。如果所有客户都能完成工作,则找到一个安全序列,银行家才安全
四:死锁的检测与恢复:
死锁检测与恢复是指系统设有专门机构,当死锁发生时,该机构能够检测到死锁发生的位置和原因,并能通过外力破坏死锁发生的必要条件,从而>使得进程从死锁的状态中恢复出来。
java死锁详解的更多相关文章
- “全栈2019”Java多线程第十九章:死锁详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Java synchronized 详解
Java synchronized 详解 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 1.当两个并发线程访问同一个对象object ...
- Java 多线程详解(四)------生产者和消费者
Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程: ...
- Java内部类详解
Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...
- 黑马----JAVA迭代器详解
JAVA迭代器详解 1.Interable.Iterator和ListIterator 1)迭代器生成接口Interable,用于生成一个具体迭代器 public interface Iterable ...
- C++调用JAVA方法详解
C++调用JAVA方法详解 博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...
- Java虚拟机详解----JVM常见问题总结
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- [转] Java内部类详解
作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置 ...
- Java面向对象详解
Java面向对象详解 前言:接触项目开发也有很长一段时间了,最近开始萌发出想回过头来写写以前学 过的基础知识的想法.一是原来刚开始学习接触编程,一个人跌跌撞撞摸索着往前走,初学的时候很多东西理解的也懵 ...
随机推荐
- 获取多个checkbox的选中值
我在这个div中添加了多个input. 拼接一下呢.最老的方法. jquery获取值: var strSel=""; $("[name='jbbm']:checked&q ...
- Spark RDD转换为DataFrame
#构造case class,利用反射机制隐式转换 scala> import spark.implicits._ scala> val rdd= sc.textFile("inp ...
- #10 Python字符串
前言 通过上一节可知,Python6个序列的内置类型中,最常见的是列表和元组,但在Python中,最常用的数据类型却不是列表和元组,而是字符串.要想深入了解字符串,必须先掌握字符编码问题.因此本篇博文 ...
- [HEOI2017] 相逢是问候
Description 支持以下两个操作: 将第 \(l\) 个数到第 \(r\) 个数 \(a_l,a_{l+1},\dots a_r\) 中的每个数 \(a_i\) 替换为 \(c^{a_i}\) ...
- [java]我的数据在哪里?——数据的内存模型
在编写程序时,我们也许会有这样一个问题,我们编写的程序中的数据运行时,会保存在哪里呢?简单直接的回答可能是——内存.这个回答在多数情况下可能都是对的,但事实上并不准确,我们都知道内存,即随机访问存储器 ...
- 正则检查是否为IP地址
/// <summary> /// 是否为ip /// </summary> /// <param name="ip"></param&g ...
- Java 雇员管理小练习(理解面向对象编程)
在学习集合框架的时候,初学者很容易练习到学生管理系统.雇员管理体统等练习题.在学习集合框架之前,基本上Java基本语法都学完了,集合框架也从侧面的检验对前面学习的理解.下面用一个曾经做过的练习题,回顾 ...
- 【Java基础】3、Java 位运算(移位、位与、或、异或、非)
public class Test { public static void main(String[] args) { // 1.左移( << ) // 0000 0000 0000 0 ...
- Python 简单的文件上传功能
简单地在程序当前目录下上传一张图片: 1.png 到程序的 yuan 文件夹下.这里使用的是固定参数 post,如果后期有需求,可以增加判断来更加完善程序. # server 端 import soc ...
- JMeter 逻辑控制之While循环控制器(While Controller)
逻辑控制之While循环控制器(While Controller) by:授客 QQ:1033553122 测试环境 apache-jmeter-2.13 1. 添加While Control ...