zoukankan      html  css  js  c++  java
  • 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个锁对象都是关闭的状态,都在等待别人释放资源(额,有点抽象!!!)

    那么如何解决呢?

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

  • 相关阅读:
    discuz制作
    Cookie和Session专题
    ecmall二次开发 直接实例化mysql对象
    ecmall widgets 挂件开发详解
    都是iconv惹的祸
    discuz+ecmall+phpcms整合
    replace into
    权限管理设计二
    权限管理设计一
    SVN服务器搭建和使用(二)
  • 原文地址:https://www.cnblogs.com/zjdbk/p/8968396.html
Copyright © 2011-2022 走看看