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面向对象详解 前言:接触项目开发也有很长一段时间了,最近开始萌发出想回过头来写写以前学 过的基础知识的想法.一是原来刚开始学习接触编程,一个人跌跌撞撞摸索着往前走,初学的时候很多东西理解的也懵 ...
随机推荐
- 通过反编译深入理解Java String及intern
一.字符串问题 字符串在我们平时的编码工作中其实用的非常多,并且用起来也比较简单,所以很少有人对其做特别深入的研究.倒是面试或者笔试的时候,往往会涉及比较深入和难度大一点的问题.我在招聘的时候也偶尔会 ...
- Spring的第四天AOP之注解版
Spring的第四天AOP之注解版 ssm框架 spring 在上一篇博客中,介绍了Spring的AOP的xml版本的使用,在这篇博客中,我将介绍一下,注解版的使用. 常用注解 注解 通知 @Aft ...
- JS读取服务器返回的XMl格式字符串
function PostSMS(phoneNumber, sessionID, requestUrl, successAction) { $.ajax( { type: 'POST', url: r ...
- 【Java】HashMap源码分析——常用方法详解
上一篇介绍了HashMap的基本概念,这一篇着重介绍HasHMap中的一些常用方法:put()get()**resize()** 首先介绍resize()这个方法,在我看来这是HashMap中一个非常 ...
- 学了9天java,没什么感觉,有点害怕,总结一下for循环。
for(int i=0; i<100; i++){ if(i%3==0){ continue://满足条件的跳过 } System.out.print(i); } //最后输出的数中没有满足3的 ...
- 漫画|你还记得原生的JDBC怎么连接数据库吗?
数据表的设计范式 在实际开发中最为常见的设计范式有三个: 第一范式是最基本的范式.如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式: 第二范式需要确保数据库表中的每一列都 ...
- Linux常用基本命令:三剑客命令之-awk格式化动作
我们之前说过,awk是一个超强的文本格式化工具,而本文的printf动作就是经常用来做格式化文本的.使用方式跟c语言的printf差不多. 1,printf默认不会回车换行 ghostwu@dev:~ ...
- Sybase SQL anywhere5.5
https://github.com/mono/old-code https://wiki.scn.sap.com/wiki/display/SQLANY/SQL+Anywhere+and+Micro ...
- fetch发送Form Data请求并携带cookie
今天我们来说说如何fetch发送Form Data请求并携带cookie,直接进入正题好吧,别问我今天为啥不在开始吹两句了,累到一句牛逼不想吹...... 步骤1: 设置头部,"Conten ...
- 如今领占主导地位的19种AI技术!
如今领占主导地位的19种AI技术! http://blog.itpub.net/31542119/viewspace-2212797/ 深度学习的突破将人工智能带进全新阶段. 2006 年-2015 ...