出现死锁的前提:
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++; } } }