死锁原因及定位分析
2019-07-09 07:08
2286 查看
1、什么是死锁?
死锁是指两个或者两个以上的进程在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉,那它们就无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很底,否则就会因为争夺有限资源而陷入死锁。
2、死锁模型图
3、死锁编码
[code]package com.lxk.com; /** * 线程操作资源类 */ class DeadLockResource implements Runnable { private String lockA; private String lockB; public DeadLockResource(String lockA, String lockB) { this.lockA = lockA; this.lockB = lockB; } @Override public void run() { synchronized (lockA) { System.out.println(Thread.currentThread().getName() + "\t 拥有" + lockA + ",试图获取" + lockB); synchronized (lockB) { System.out.println(Thread.currentThread().getName() + "\t 拥有" + lockB + ",试图获取" + lockA); } } } } /** * 死锁是指两个或者两个以上的进程在执行过程中, * 因争夺资源而造成的一种相互等待的现象, * 若无外力干涉,那它们就无法推进下去,从而造成死锁现象。 */ public class DeadLockDemo { public static void main(String[] args) { String lockA = "lockA"; String lockB = "lockB"; new Thread(new DeadLockResource(lockA, lockB), "ThreadA").start(); new Thread(new DeadLockResource(lockB, lockA), "ThreadB").start(); } }
程序执行结果如下:ThreadA持有lockA,试图获取lockB;而ThreadB持有lockB,试图获取lockA;造成两个线程相互等待,又没有外力干涉,无法推进下去,最终导致死锁现象。
4、死锁定位分析
- Linux环境下查看进程:ps -ef | grep java 或者 jps-l
- Windows环境下查看java进程:jps -l
- Windows环境下查看死锁栈信息:jstack+进程号
第一步:使用jps -l查看运行的java进程号
第二步:使用jstack+进程号查看死锁栈信息
ThreadA 和 ThreadB 相互等待对方拥有的锁资源:
ThreadA持有锁locked <0x000000076b9036c8>,但是等待锁waiting to lock <0x000000076b903700>
ThreadB持有锁locked <0x000000076b903700>,但是等待锁waiting to lock <0x000000076b9036c8>
相关文章推荐
- Android中ANR产生的原因以及定位分析和检测
- (转帖)分析数据库死锁原因的方法
- suspend造成死锁的例子和原因分析 http://blog.csdn.net/magictong/article/details/4161571
- 分析数据库死锁原因的方法
- ANR产生的原因及其定位分析
- 分析数据库死锁原因的方法
- Win10黑屏卡死原因分析--罕见的内核pushlock死锁问题
- 造成数据库表死锁的原因分析及解决方案
- websphere服务器cpu使用率较高原因定位分析
- 如何获得你的准确位置及iphon手机应用定位不准确原因分析
- ANR产生的原因及其定位分析
- java死锁的原因分析及解锁和预防措施
- oracle死锁原因分析
- java死锁原因定位。java命令方式来查看运行了的栈内存信息
- oracle死锁原因分析
- 通过日志定位分析接口调用缓慢的原因
- Android ANR产生的原因以及其定位分析
- 系统产生死锁的原因分析
- oracle死锁原因分析 &lt;转&gt;
- MySQL死锁原因分析