出现死锁的前提:
1.必须是多线程
2.出现了同步嵌套
先定义两个锁类:
/*
* 定义A对象锁
* 将构造器私有化,使得外类中不能创建A锁对象
* 创建静态A锁对象,让外类直接 类名.成员变量名 调用这个锁
* 这种方式保证了死锁的另一前提—锁的唯一性,否则两个同步嵌套各有各的锁,就形不成死锁
*/
public class LockA {
private LockA() {
super();
}
public final static LockA locka = new LockA();
}
/*
* 定义B对象锁
* 将构造器私有化,使得外类中不能创建B锁对象
* 创建静态B锁对象,让外类直接 类名.成员变量名 调用这个锁
* 这种方式保证了死锁的另一前提—锁的唯一性,否则两个同步嵌套各有各的锁,就形不成死锁
*/
public class LockB {
private LockB() {
super();
}
public static final LockB lockb = new LockB();
}
定义死锁类:
/*
* 死锁案例,由于存在两种状态:1.先获取A锁再获取B锁 2.先获取B锁再获取A锁
* 所以使用奇偶数来定义两种状态(boolean也可以)
* 在同步代码块中使用静态调用方式,可以保证获取到的是唯一锁
*/
public class DeadLock implements Runnable{
private int i = 0;
public void run() {
while(true) {
if(i % 2 == 0) {
//先进A同步,再进入B同步
synchronized(LockA.locka) {
System.out.println("if...locka");
synchronized(LockB.lockb) {
System.out.println("if...lockb");
}
}
}else {
//先进B同步,再进A同步
synchronized (LockB.lockb) {
System.out.println("else...lockb");
synchronized (LockA.locka) {
System.out.println("else...locka");
}
}
}
i++;
}
}
}