zoukankan      html  css  js  c++  java
  • Java 死锁以及死锁的产生

    public class DeadLockSample {
        public static void main(String[] args) {
            DeadLock d1 = new DeadLock(true);
            DeadLock d2 = new DeadLock(false);
            d1.start();
            d2.start();
        }
    }
    
    class Lock {
        /**
         * 死锁定义 所谓死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
         * 死锁发生时的条件:     *
         * (1)互斥条件:一个资源每次只能被一个进程使用。独木桥每次只能通过一个人。     *
         * (2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。乙不退出桥面,甲也不退出桥面。     *
         * (3)不剥夺条件: 进程已获得的资源,在未使用完之前,不能强行剥夺。甲不能强制乙退出桥面,乙也不能强制甲退出桥面。     *
         * (4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。如果乙不退出桥面,甲不能通过,甲不退出桥面,乙不能通过。
         * 先看生活中的一个实例,两个人面对面过独木桥,甲和乙都已经在桥上走了一段距离,即占用了桥的资源,甲如果想通过独木桥的话,
         * 乙必须退出桥面让出桥的资源,让甲通过,但是乙不服,为什么让我先退出去,我还想先过去呢,于是就僵持不下,导致谁也过不了桥,这就是死锁。
         * <p>
         * 在计算机系统中也存在类似的情况。例如,某计算机系统中只有一台打印机和一台输入 设备,进程P1正占用输入设备,
         * 同时又提出使用打印机的请求,但此时打印机正被进程P2 所占用,而P2在未释放打印机之前,
         * 又提出请求使用正被P1占用着的输入设备。这样两个进程相互无休止地等待下去,均无法继续执行,此时两个进程陷入死锁状态。
         * 下面代码将产生死锁
         */
    
        static Object obja = new Object();
        static Object objb = new Object();
    }
    
    class DeadLock extends Thread {
        private boolean flag;
    
        DeadLock(boolean flag) {
            this.flag = flag;
        }
    
        @Override
        public void run() {
            if (flag) {
                synchronized (Lock.obja) {
                    System.out.println("if obja");
                    synchronized (Lock.objb) {
                        System.out.println("if objb");
                    }
                }
            } else {
                synchronized (Lock.objb) {
                    System.out.println("else objb");
                    synchronized (Lock.obja) {
                        System.out.println("else obja");
                    }
                }
            }
        }
    }
    

      

  • 相关阅读:
    Oracle11g聚合函数
    和为S的连续正数数列,动态规划,C++
    统计一个数组在排序数组中出现的次数,C++,二分查找
    寻找两个链表的第一个公共子节点,C++
    二维数组中的查找
    数组中的逆序对,C++,分治算法
    得到从小到大的第N个丑数的三种方式(C++)一维动态规划
    连续字数组的最大和(Java)一个int数组,求其中的最大的连续数的和
    n个整数,求这中间最小的k个整数(Java)
    两个字符串的最长公共子串求法(C++、动态规划)
  • 原文地址:https://www.cnblogs.com/smartsmile/p/11607480.html
Copyright © 2011-2022 走看看