• 代码出现死锁以及解决方案


     
    public class Lock1 implements Runnable{
    
    
        @Override
        public void run() {
            System.out.println("lock1 running");
    
            while (true){
                try {
                    synchronized (LockUtils.obj1){
                        System.out.println("lock1 锁 obj1");
    
                        Thread.sleep(3000);
                        synchronized (LockUtils.obj2) {
                            System.out.println("lock1 锁 obj2");
    
                        }
                    }
    
    
          }catch (Exception e){
                e.getMessage();
            }
    
            }
        }
    }
    

      ---->

    public class Lock2  implements Runnable{
    
        @Override
        public void run() {
            System.out.println("lock 2 running");
            try {
                while (true){
    
                    synchronized (LockUtils.obj2){
                        System.out.println("lock2 锁 obj2");
                        Thread.sleep(3000);
                        synchronized (LockUtils.obj1){
                            System.out.println("lock2 锁 obj1");
                        }
                    }
                }
            }catch (Exception e){
                e.getMessage();
            }
    
    
        }
    }
    public class LockUtils {
        public static String obj1="obj1";
        public static String obj2="obj2";
    
    }
    public class Main {
        public static void main(String[] args) {
              Thread a = new Thread(new Lock1());
              Thread b = new Thread(new Lock2());
              a.start();
              b.start();
        }
    }
    

      

     程序不结束,还在运行,代码不继续打印

     -----------------------------------------------------------------------------------------

    产生死锁的四个必要条件:
    1.互斥,共享资源x和y只能被一个线程占用;
    2.占有且等待,线程01已经取得共享资源x,在等待共享资源y的时候,不释放共享资源x;
    3.不可抢占,其他线程不能强行抢占线程01占有的资源;
    4.循环等待,线程01等待线程02占有的资源,线程02,等待线程01占有的资源。

    --------------------------------------------------------------------------------------------------------------------------------------

    互斥: 一次性 申请所有资源,不存在等待问题了。
    不可抢占: 如果申请不到资源,在一定时间后,主动释放抢占的资源,这样就解决了不可抢占的条件。
    循环等待:

  • 相关阅读:
    STL_算法_05_集合算法
    STL_算法_04_算术和生成算法
    STL_算法_03_拷贝和替换算法
    STL_算法_02_排序算法
    STL_算法_01_查找算法
    STL_容器使用时机
    STL_容器共通能力
    Qt5_选择文件对话框
    Qt5_当前exe所在路径
    Java 静态代理和动态代理
  • 原文地址:https://www.cnblogs.com/q1359720840/p/16045874.html
Copyright © 2020-2023  润新知