zoukankan      html  css  js  c++  java
  • 死锁产生的原因及条件和手写死锁

    什么是死锁?

    由于两个或者多个线程互相持有对方所需要的资源,导致线程处于等待状态,造成死锁。

    为什么会产生死锁(为什么会互相占用对方的资源)

    • 因为系统资源不足。
    • 进程运行推进的顺序不合适。
    • 资源分配不当等。

    产生死锁的四个必要条件

    互斥条件:一个资源每次只能被一个进程使用。

    请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

    不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

    循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

    手写死锁

    public class DeadLock {
        public static void main(String[] args) {
            Object object1 = new Object();
            Object object2 = new Object();
            Thread thread1 = new Thread(new FirstThread(object1, object2));
            Thread thread2 = new Thread(new SecondThread(object1, object2));
            thread1.start();
            thread2.start();
        }
    }
    
    class FirstThread implements Runnable {
        Object object1;
        Object object2;
    
        public FirstThread(Object object1, Object object2) {
            this.object1 = object1;
            this.object2 = object2;
        }
    
        @Override
        public void run() {
            synchronized (object1) {// 获得锁对象1
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                synchronized (object2) {// 获得锁对象2
    
                }
            }
        }
    }
    
    class SecondThread implements Runnable {
        Object object1;
        Object object2;
    
        public SecondThread(Object object1, Object object2) {
            this.object1 = object1;
            this.object2 = object2;
        }
    
        @Override
        public void run() {
            synchronized (object2) {// 获得锁对象2
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                synchronized (object1) {// 获得锁对象1
    
                }
            }
        }
    }
  • 相关阅读:
    mysql基础之日志管理(查询日志、慢查询日志、错误日志、二进制日志、中继日志、事务日志)
    jQuery1.9.1针对checkbox的调整
    管理 sendmail 的邮件队列
    将以管理员方式运行cmd运行方式放到win7任务栏
    转 git操作小结
    [转]前端CSS规范整理
    jQuery 1.9不支持$.browser 怎么判断浏览器类型和版本
    js闭包陷阱问题
    关于NGINX下开启PHP-FPM 输出PHP错误日志的设置(已解决)
    PHP中cURL错误号对照[转]
  • 原文地址:https://www.cnblogs.com/java-spring/p/10792062.html
Copyright © 2011-2022 走看看