Java 多线程死锁_开发语言

Java 多线程死锁_开发语言_02

死锁演示代码

public class TestDeadLock {
static Object a = new Object();
static Object b = new Object();

public static void main(String[] args) {
new Thread(() -> {
synchronized (a) {
System.out.println(Thread.currentThread().getName() + "持有锁a,试图获取锁b");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (b) {
System.out.println(Thread.currentThread().getName() + "获取锁b");
}
}
}, "A线程").start();

new Thread(() -> {
synchronized (b) {
System.out.println(Thread.currentThread().getName() + "持有锁b,试图获取锁a");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (a) {
System.out.println(Thread.currentThread().getName() + "获取锁a");
}
}
}, "B线程").start();
}
}

验证死锁

1,在idea终端,输入jps -l,找到我们程序的ID 如下283028

Java 多线程死锁_后端_03

2,jvm自带的堆栈跟踪工具,在终端输入 jstack 283028

Java 多线程死锁_开发语言_04

可以看到两个线程在互相等待,并且提示发现一个死锁