死锁条件(缺一不可):
- 持有等待
- 资源互斥
- 不可剥夺
- 链式循环
网上对这四条详解的例子很多,不多赘述
使用Java的Synchronized记录一个死锁例子;基本思想:定义两个静态对象,然后再main方法启动两个线程,分别持有一个对象去调用另一个对象(链式调用);
Synchronized可修饰类、对象、变量,此例子修饰对象,在当前线程调用该对象未结束时不能被其他线程调用
public class LockDead {
static Object LockA = new Object();
static Object LockB = new Object();
public static void main(String[] args) {
Thread a = new Thread(() -> {
synchronized (LockA) {
System.out.println(Thread.currentThread().getName() + "\t" + "持有对象A试图获取对象B");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (LockB) {
System.out.println(Thread.currentThread().getName() + "\t" + "获取对象B成功");
}
}
}, "a");
a.start();
new Thread(() -> {
synchronized (LockB) {
System.out.println(Thread.currentThread().getName() + "\t" + "持有对象B试图获取对象A");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (LockA) {
System.out.println(Thread.currentThread().getName() + "\t" + "获取对象A成功");
}
}
}, "b").start();
}
}