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面向对象详解 前言:接触项目开发也有很长一段时间了,最近开始萌发出想回过头来写写以前学 过的基础知识的想法.一是原来刚开始学习接触编程,一个人跌跌撞撞摸索着往前走,初学的时候很多东西理解的也懵 ...
随机推荐
- Angular学习第一步
前端开发越来越流行了,作为后端开发人员,也开始需要学习前端了.随着前端技术的发展,前端技术也越来越复杂,复杂程度不亚于后端,各种框架各种设计模式前端都用上了,什么AngularJS,Angular, ...
- [LeetCode解题报告] 502. IPO
题目描述 假设 LeetCode 即将开始其 IPO.为了以更高的价格将股票卖给风险投资公司,LeetCode希望在 IPO 之前开展一些项目以增加其资本. 由于资源有限,它只能在 IPO 之前完成最 ...
- SpringMVC Hello World
前言 新年伊始,元宵佳节,窗外灯火通明,炮声连连.北漂以来第一次一个人在北京过十五. 切入正题,收假后一边要赶项目进度还要学习java,so在元宵佳节之际写了第一篇SpringMVC Hello Wo ...
- IdentityServer4 中文文档 -6- (简介)示例服务器和测试
IdentityServer4 中文文档 -6- (简介)示例服务器和测试 原文:http://docs.identityserver.io/en/release/intro/test.html 目 ...
- Redis Eval Script
简介 从Redis 2.6 版本开始,内嵌支持 Lua 环境.通过使用EVAL或EVALSHA命令可以使用 Lua 解释器来执行脚本. EVAL和EVALSHA的使用是差不多的(下面有讲区别). EV ...
- Maven的pom.xml文件详解【转载】
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- HDU6213
Chinese Zodiac Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)To ...
- Sybase SQL anywhere5.5
https://github.com/mono/old-code https://wiki.scn.sap.com/wiki/display/SQLANY/SQL+Anywhere+and+Micro ...
- nativefier(一行代码将任意网页转化为桌面应用)
刚刚在看前端九部的手册的时候,发现一个之前没有用过的骚东西,看上去还挺好用,我这个好奇心瞬间就窜的老高了,赶紧试一试,看看这个东西有没有必要收入我的胯下 结果实验完了之后, 必须必须要强行安利给你们 ...
- 使用 NGINX 流控和 fail2ban 防止 CC 攻击
背景知识 CC 攻击 攻击者通过创建大量请求导致服务器资源耗尽,主要针对特定服务接口,属于实现 DoS 攻击的一种方式(DoS 攻击更多是针对网络端口,而不是具体服务接口). NGINX 流控 lim ...