1、死锁主要原因
系统资源不足
进程运行推进的顺序不合适
资源分配不当
2、模拟死锁代码
package com.example.testdemo.juc;
public class DeadLockTest {
public static void main(String[] args) {
Object A = new Object();
Object B = new Object();
Thread threadA = new Thread(() -> {
synchronized (A){
System.out.println(Thread.currentThread().getName()+"持有A锁,希望获得B锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(B){
System.out.println(Thread.currentThread().getName()+"获取B锁成功");
}
}
},"A");
Thread threadB = new Thread(() -> {
synchronized (B){
System.out.println(Thread.currentThread().getName()+"持有B锁,希望获得A锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(A){
System.out.println(Thread.currentThread().getName()+"获取A锁成功");
}
}
},"B");
threadA.start();
threadB.start();
}
}
运行结果:
可以看到程序运行的用户线程一直未结束,产生了死锁问题。
3、如何排查死锁
1)在jdk的bin目录下打开cmd窗口,输入jps -l
查看java进程情况和进程id
继续输入 jstack+进程号
可以看到最后的打印日志显示,A锁着 <0x000000072fd223c8>等待 <0x000000072fd223d8>,B则锁着 <0x000000072fd223d8>并等待 <0x000000072fd223c8>,互相持有互相等待,产生deadlock
2)在bin目录下打开jconsole.exe,在线程tab里面点击检索死锁按钮,可以看到相同的结果