1. 演示死锁代码
/**
* description: 演示死锁
*
* <h1>死锁的几个条件</h1>
*
* <li>互斥性(资源被一个线程使用(占有)时,别的线程不能使用)</li>
* <li>不可抢占(资源只能由资源占有者主动释放)</li>
* <li>请求和保持(资源请求者在请求其他的资源的同时保持对原有资源的占有)</li>
* <li>阻塞等待</li>
*
* @author wwp
* @since 2022/4/3 21:11
**/
public class Deadlock {
public final static Object obj = new Object();
public final static Object obj2 = new Object();
public static void main(String[] args) {
new Thread(() -> {
synchronized (obj) {
System.out.println(Thread.currentThread().getName() + ">>> 持有锁obj ,试图获取锁obj2");
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2) {
System.out.println(Thread.currentThread().getName() + ">>> 获取锁obj2");
}
}
}, "AA").start();
new Thread(() -> {
synchronized (obj2) {
System.out.println(Thread.currentThread().getName() + ">>> 持有锁obj2,试图获取锁obj");
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj) {
System.out.println(Thread.currentThread().getName() + ">>> 获取锁obj");
}
}
}, "BB").start();
}
}
2. 死锁检测
- 定位线程
- 分析线程堆栈信息