• 手写一个简单的死锁代码


    手写一个简单的死锁代码

    死锁原因

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

    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

    欢迎关注 个人博客

  • 相关阅读:
    Python使用struct处理二进制
    ProtoBuf与Python结合使用初步
    智能指针shared_ptr的用法
    C++模板
    mac 安装protobuf,并编译为java,c++,python
    java的HashCode方法
    JVM的内存结构
    HashSet与TreeSet的比较
    面向对象的特征有哪些方面?
    Collection与Collections的区别是什么?
  • 原文地址:https://www.cnblogs.com/jakaBlog/p/11395220.html
Copyright © 2020-2023  润新知