zoukankan      html  css  js  c++  java
  • 手写一个简单的死锁代码

    手写一个简单的死锁代码

    死锁原因

    多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放,而该资源又被其他线程锁定,从而导致每一个线程都得等其它线程释放其锁定的资源,造成了所有线程都无法正常结束。这是从网上其他文档看到的死锁产生的四个必要条件:

    1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用

    2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。

    3、请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。

    4、循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。

    当上述四个条件都成立的时候,便形成死锁。当然,死锁的情况下如果打破上述任何一个条件,便可让死锁消失。下面用java代码来模拟一下死锁的产生。

    相关代码

    • 线程1
    package org.yujuan.thread.deadlock;
    
    /**
     * The type Lock 1.
     *
     * @author yujuan
     * @time 2019 /08/22 16:16:42
     */
    class Lock1 implements Runnable {
        @Override
        public void run() {
            try {
                System.out.println("Lock1 running");
                while (true) {
                    synchronized (DeadLock.obj1) {
                        System.out.println("Lock1 lock obj1");
                        Thread.sleep(3000);//获取obj1后先等一会儿,让Lock2有足够的时间锁住obj2
                        synchronized (DeadLock.obj2) {
                            System.out.println("Lock2 lock obj2");
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    
    • 线程2
    package org.yujuan.thread.deadlock;
    
    /**
     * The type Lock 2.
     *
     * @author yujuan
     * @time 2019 /08/22 16:19:38
     */
    class Lock2 implements Runnable {
        @Override
        public void run() {
            try {
                System.out.println("Lock2 running");
                while (true) {
                    synchronized (DeadLock.obj2) {
                        System.out.println("Lock2 lock obj2");
                        Thread.sleep(3000);
                        synchronized (DeadLock.obj1) {
                            System.out.println("Lock2 lock obj1");
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    
    • 主函数
    package org.yujuan.thread.deadlock;
    
    
    /**
     * The type Dead lock.
     *
     * @author yujuan
     * @time 2019 /08/22 16:16:42
     */
    public class DeadLock {
        /**
         * The constant obj1.
         *
         */
        public static String obj1 = "obj1";
        /**
         * The constant obj2.
         */
        public static String obj2 = "obj2";
    
        /**
         * Main.
         *
         * @param args the args
         * @author yujuan
         * @time 2019 /08/22 16:16:42
         */
        public static void main(String[] args) {
            Thread a = new Thread(new Lock1());
            Thread b = new Thread(new Lock2());
            a.start();
            b.start();
        }
    }
    

    运行结果

    运行结果

    项目代码 Github

    欢迎关注 个人博客

  • 相关阅读:
    [ jquery 选择器 :hidden ] 此方法选取匹配所有不可见元素,或者type为hidden的元素
    剑指 Offer 03. 数组中重复的数字 哈希
    LeetCode 1736. 替换隐藏数字得到的最晚时间 贪心
    Leetcode 1552. 两球之间的磁力 二分
    Leetcode 88. 合并两个有序数组 双指针
    LeetCode 1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?
    LeetCode 1743. 相邻元素对还原数组 哈希
    LeetCode 1745. 回文串分割 IV dp
    剑指 Offer 47. 礼物的最大价值 dp
    剑指 Offer 33. 二叉搜索树的后序遍历序列 树的遍历
  • 原文地址:https://www.cnblogs.com/jakaBlog/p/11395220.html
Copyright © 2011-2022 走看看