进程死锁及解决办法:
一:死锁的概念:
    死锁是进程死锁的简称
    什么是死锁:
    死锁是指多个进程循环等待他方占有的资源而无限的僵持下去的局面。很显然,没有外力作用,那么死锁涉及到的各个进程都将永远处于>封锁状态。计算机系统产生死锁的根本原因就是资源有限且操作不当。即为:一种原因是系统提供的资源太少了,远不能满足并发进程对资源的需求。这种竞争资源>引起的死锁是我们将要讨论的核心。例如:一种临时性资源。某一时刻,进程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死锁详解的更多相关文章

  1. “全栈2019”Java多线程第十九章:死锁详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  2. Java synchronized 详解

    Java synchronized 详解 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 1.当两个并发线程访问同一个对象object ...

  3. Java 多线程详解(四)------生产者和消费者

    Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程: ...

  4. Java内部类详解

    Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...

  5. 黑马----JAVA迭代器详解

    JAVA迭代器详解 1.Interable.Iterator和ListIterator 1)迭代器生成接口Interable,用于生成一个具体迭代器 public interface Iterable ...

  6. C++调用JAVA方法详解

    C++调用JAVA方法详解          博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...

  7. Java虚拟机详解----JVM常见问题总结

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  8. [转] Java内部类详解

    作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置 ...

  9. Java面向对象详解

    Java面向对象详解 前言:接触项目开发也有很长一段时间了,最近开始萌发出想回过头来写写以前学 过的基础知识的想法.一是原来刚开始学习接触编程,一个人跌跌撞撞摸索着往前走,初学的时候很多东西理解的也懵 ...

随机推荐

  1. 程序员进阶之算法练习:LeetCode专场

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由落影发表 前言 LeetCode上的题目是大公司面试常见的算法题,今天的目标是拿下5道算法题: 题目1是基于链表的大数加法,既考察基本 ...

  2. spring cloud config客户端

    上篇介绍了spring cloud config服务器,本篇介绍客户端.客户端主要是从config服务器获取配置信息. 代码示例 首先创建一个Maven项目,在pom.xml文件中添加依赖: < ...

  3. C# ValueTuple 原理

    本文告诉大家一些 ValueTuple 的原理,避免在使用出现和期望不相同的值.ValueTuple 是 C# 7 的语法糖,如果使用的 .net Framework 是 4.7 以前,那么需要使用 ...

  4. 【转】Git 教程之协同开发

    前面我们已经介绍过远程仓库的相关概念,不过那时并没有深入探讨,只是讲解了如何创建远程仓库以及推送最新工作成果到远程仓库,实际上远程仓库对于团队协同开发很重要,不仅仅是团队协同开发的基础,也是代码备份的 ...

  5. 【协议】2、TCP/IP协议三次握手与四次握手流程解析

    一.TCP报文格式  TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷本.下面是TCP报文格式图:图1 TCP报文格式  上图中有几个字段需要重点介绍下:  (1)序号:Seq序 ...

  6. CSS如何让不相等的字符上下对齐

    最后效果: <div class="main"> <span style="font-size:12px;"><dl class= ...

  7. 关于git的一个错误提示

    一般clone仓库后如果,remote -v或者add出现如下的错误的话: Not a git repository (or any of the parent directories): .git需 ...

  8. table垂直居中

    th,td{ text-align:center;/** 设置水平方向居中 */ vertical-align:middle/** 设置垂直方向居中 */ }

  9. CentOS 通过yum来升级php到php5.6,yum upgrade php 没有更新包

    在文章中,我们将展示在centOS系统下如何将php升级到5.6,之前通过yum来安装lamp环境,直接升级的话,提示没有更新包,也就是说默认情况下php5.3.3是最新 1.查看已经安装的php版本 ...

  10. python之变量与常量

    变量:把程序运行过程中产生的值,暂时存储在内存,方便后面的程序调用. 被引号括起来的内容是字符串,原样输出.#单行注释 用来标注代码信息,特点:被注释的内容不会被执行.Ctrl + /'''内容''' ...