1.什么是死锁?
当线程任务中出现了许多同步(多个锁)时,如果同步中嵌套了同步。这是容易引发一种现象:程序处于无限等待的状态,这种现象我们称之为死锁。
这里先创建两个唯一的锁
package cn.itcast.demo04;
public class LockA {
//私有构造器,保证这个锁唯一
private LockA(){}
//只希望本类调用,不希望外类new,保证唯一
//外面的类不能new,只能静态类名调用静态成员变量
public static final LockA locka = new LockA();
}
package cn.itcast.demo04;
public class LockB{
private LockB(){}
//只希望本类调用,不希望外类new,保证唯一
public static final LockB lockb = new LockB();
}
这里是Runable的实现类
package cn.itcast.demo04;
public class DeadLock implements Runnable {
private int i = 0;
// 重写run方法
public void run() {
while (true) {
if (i % 2 == 0) {
// 如果A是偶数,先进入A同步,在进入B同步
synchronized (LockA.locka) {
System.out.println("进入if语句中的locka");
synchronized (LockB.lockb) {
System.out.println("进入if语句中的lockb");
}
}
} else {
synchronized (LockB.lockb) {
System.out.println("进入else语句中的lockb");
synchronized (LockA.locka) {
System.out.println("进入else语句中的locka");
}
}
}
i++;
}
}
}
这里实现死锁
package cn.itcast.demo04;
public class DeadLockDemo {
public static void main(String[] args) {
//创建Runnable接口的实现类
DeadLock dead = new DeadLock();
Thread t0 = new Thread(dead);
Thread t1 = new Thread(dead);
t0.start();
t1.start();
}
}
结果如下图
右上角的红点表示程序尚未结束,因为此时,上面的同步等待下面的同步释放锁B,而下面的同步等待上面的同步释放锁A,造成了两个程序互相等待,而无法让程序继续下去,即发生了死锁现象。