原 java 死锁的产生和定位分析
版权声明:本文为博主原创文章,请尊重他人的劳动成果,转载请附上原文出处链接和本声明。
本文链接:https://www.91mszl.com/zhangwuji/article/details/1156
死锁的概念:
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉,那他们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。
死锁产生的原因:
(1)系统资源不足。
(2)进程运行推进的顺序不合适。
(3)资源分配不当。
死锁的代码如下:
模拟场景:线程A自己持有锁A,试图再去获取锁B,线程B自己持有锁B,试图再去获取锁A。
package com.mszl.thread;
/**
* 功能:写一个死锁程序
* 备注:更多资料请访问 http://www.91mszl.com
* @author bobo teacher
*/
class dead implements Runnable{
private String lockA;
private String lockB;
public dead(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);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB) {
System.out.println(Thread.currentThread().getName() + "\t" + "自己持有锁: " + lockB + " 尝试获得" + lockA);
}
}
}
}
public class DeadLockDemo {
public static void main(String[] args) {
String lockA="锁A";
String lockB="锁B";
Thread t1=new Thread(new dead(lockA, lockB), "线程A");
t1.start();
Thread t2=new Thread(new dead(lockB, lockA), "线程B");
t2.start();
}
}
执行结果:
出现死锁后的定位:
(1)打开cmd窗口,输入jps -l 命令
我们可以看到有问题的进程编号为6680
(2)在输入命令 jstack 6680,将会打印出详细的错误信息。
通过上面的日志截图我们可以看到:
线程B:等待waiting to lock <0x04d22f40>;线程A:locked <0x04d22f40>,这就是导致死锁的原因。
2019-12-04 11:16:30 阅读(1021)
名师出品,必属精品 https://www.91mszl.com
博主信息