基本介绍
多个线程都占用了对方的锁资源,但不肯相让,导致了死锁,在编程是一定要规避死锁的发生的。
例如: 小明的妈妈:你先完成作业,才让你玩手机。
小明:你先让我玩手机,我才完成作业。
如果双方一直僵持的话就会形成一个死循环。 这就类似于线程的死锁。
代码分析如下:
//线程死锁
public class DeadLock_ {
public static void main(String[] args) {
//新建两个DeadLockDemo对象 a b
DeadLockDemo a = new DeadLockDemo(true);
a.setName("A");//设置线程名称
DeadLockDemo b = new DeadLockDemo(false);
b.setName("B");
//启动线程
a.start();
b.start();
}
}
//死锁演示
class DeadLockDemo extends Thread {
//先定义两个object对象
//为了保证多线程共享一个对象需要在前面加上static关键字
static Object o1 = new Object();
static Object o2 = new Object();
//定义一个boolean对象 用作条件判断
boolean flag;
//创建DeadLockDemo的有参构造器
public DeadLockDemo(boolean flag){//传入flag
this.flag = flag;//这里的flag = 构造器传入的flag
}
//重写run方法
@Override
public void run() {
//设立以flag为条件的 判断语句
if (flag){
synchronized (o1){// 进入1 和 进入2 形成同步代码
System.out.println(Thread.currentThread().getName() + "进入1");
synchronized (o2){//这里只有获得o2锁才能继续往下执行 不然就一直停在上一条语句中
System.out.println(Thread.currentThread().getName() + "进入2");
}
}
}else {
synchronized (o2){
System.out.println(Thread.currentThread().getName() + "进入3");
synchronized (o1){//这里只有获得o1锁才能继续往下执行 不然就一直停在上一条语句中
System.out.println(Thread.currentThread().getName() + "进入4");
}
}
}
}
}
运行结果如下:
解释:A线程在进入到if中时 flag 为true 此时 进入到synchronized(o1)中输出语句后,等待获取o2对象锁才能继续往下执行。而B线程也如此,在输出第一条语句后就会等待获取o1对象锁才能继续往下执行。但是双方是不可能让出对方的锁,这样就形成了死锁,两个语句都造成了同步代码的堵塞。所以最最最重要的是在编程中要规避这种情况的发生。