38. 死锁

死锁:
  出现死锁的原因:线程A等待线程B释放锁资源,同时线程B等待线程A释放资源

可能出现死锁的情况:

  1.存在2个或者2个以上的线程

  2.存在2个或者2个以上的共享资源
 
需求:

  有2个人要看电视,狗蛋有遥控器,张三有电池。只有电池和遥控器都有了才能看电视

代码如下:

class DeadLock extends Thread{
    
    public DeadLock(String name) {
        super(name);
    }
    
    @Override
    public void run() {
        if("张三".equals(Thread.currentThread().getName())) {
            synchronized ("电池") {
                System.out.println("张三拿到了电池,准备去拿遥控器");
                synchronized ("遥控器") {
                    System.out.println("张三拿到了遥控器,去看电视去了");
                }
            }
        }else if("狗蛋".equals(Thread.currentThread().getName())){
            synchronized ("遥控器") {
                System.out.println("狗蛋拿到了遥控器,准备去拿电池");
                synchronized ("电池") {
                    System.out.println("狗蛋拿到了电池,去看电视去了");
                }
            }
        }
    }
}
public class Demo6 {
    public static void main(String[] args) {
        DeadLock deadlock1 = new DeadLock("狗蛋");
        DeadLock deadlock2 = new DeadLock("张三");
        deadlock1.start();
        deadlock2.start();
    }
}

可以发现张三拿到了电池却怎么也拿不到遥控器,狗蛋拿到了遥控器却拿不到电池,都在等待对方释放资源,这样的结果就导致死锁

分析原因:

    当张三拿到了电池时,同时狗蛋也拿到了遥控器。所以这2个锁对象都是关闭的状态,都在等待别人释放资源(额,有点抽象!!!)

那么如何解决呢?

  默哀,根本没有解决方案,只有自己去避免发生

猜你喜欢

转载自www.cnblogs.com/zjdbk/p/8968396.html