Java多线程之死锁
什么是死锁
A、B两台车过桥,桥只能过一台车,A、B分别是桥的两头,A不让B,B不让A
怎么查出死锁(两种方法)
方法一
- JConsole找到本地进程
- 找到线程选项卡,然后检查死锁
- 找到blocked状态的线程,看它需要资源的拥有者
方法二
- JVM自带的命令jps查看进程
- Jstack查看栈的使用情况
怎样从死锁中恢复过来
1. 重启系统,代价大,之前的工作白费,所有正在运行的现场都去掉了
2. 撤销进程,剥夺资源。终止参与死锁的进程,回收他们占的资源,从而解除死锁。这又分两种,一次性撤销参与死锁的全部进程,剥夺全部资源;或者逐步撤销参与死锁的进程。一般来说,逐步撤销要按一定的原则,目的是撤销代价最小的进程,比如按优先级确定线程代价。
3. 进程回退,死锁的线程回退到没有发生死锁的某一点,继续执行。
死锁条件
- 互斥:资源在一段时间内只能被一个线程使用
- 不可抢占:不能强行从别的线程将资源抢走
- 占有且申请:自己占有资源,又申请另一个资源
- 循环
避免死锁的方法
- 打破上面的条件,就能解除或避免死锁
- 避免嵌套锁,只有需要的地方使用锁
- 避免无限期等待也是避免死锁的常用方法
- 使用一些避免死锁的算法:有序资源分配法、银行家算法
N个线程访问N个资源,同时不死锁,用下面算法解决
有序资源排序法
线程所需要的资源统一编号,申请资源时一定要按照编号顺序申请。
例子
- 线程A使用资源的顺序时R1、R2,线程B使用资源的顺序是R2、R1,这样就可能导致死锁
- 有序资源分配法:R1编号为1,R2编号为2
- A申请资源的顺序是R1、R2,B申请资源的顺序是R1、R2,就不会出现死锁了
银行家算法
- 当线程首次申请资源时,要测试改线程对资源的最大需求量,如果资源能满足最大请求量,就分配,否则推迟分配
- 当线程在执行中继续申请资源,先测试该线程本次申请的资源数是否超过了该资源所剩余的总量,如满足则分配,不满足则推迟
相关推荐
java多线程死锁预防机制研究,java多线程死锁预防机制研究
Java多线程程序死锁检查 JCarder
本篇文章主要介绍了Java多线程之死锁的出现和解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
明白死锁产生的原因,在程序中演示死锁产生并从而实现多线程陈旭解决死锁(deadlock)这一类问题。
java多线程及死锁
基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip ...
java源码:Java多线程程序死锁检查 JCarder.zip
Java多线程程序死锁检查 JCarder.7z
Java多线程之-死锁.doc
源码—Java多线程5—死锁和wait notify notifyAll
Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java线程:新特征-信号量 Java线程:新...
基于Java的多线程程序死锁检查 JCarder.zip
基于java的多线程程序死锁检查 JCarder.zip
主要介绍了Java多线程死锁,结合实例形式分析了Java多线程出现死锁的相关原因与操作注意事项,需要的朋友可以参考下
详细的讲述了多线程的各种用法 Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠...
Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 ...Java线程:并发协作-死锁 55 Java线程:线程之间的数据传递 58
本文首先介绍了线程的有关概念,接着介绍了线程的生命期及其状态间的转换,多线程的调度 原则,线程的死锁,详细阐述了多线程的两种实现方法: 由Thread类派生子类;实现Runnable接口
死锁问题,java多线程死锁
Java多线程程序死锁检查类库 JCarder
基于Java的源码-多线程程序死锁检查 JCarder.zip