91名师指路-头部
91名师指路

java 死锁的产生和定位分析

由于某些原因,现在不支持支付宝支付,如需要购买源码请加博主微信进行购买,微信号:13248254750

死锁的概念:

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉,那他们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。


死锁产生的原因:

(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     阅读(876)

名师出品,必属精品    https://www.91mszl.com

联系博主    
用户登录遮罩层
x

账号登录

91名师指路-底部