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
    
                }
            }
        }
    }
  • 相关阅读:
    对函数的推广
    自然语言也支持泛型
    用委托实现对List的常用方法提取
    C#中的特性(Attributes)(翻译)(转)
    用JQUERY增删元素
    表格折叠展开
    下一代编程语言可能具有的特点
    一种多继承方案
    几年前毕业设计做的CAD二次开发
    数据结构 003.1.1 栈的基本概念
  • 原文地址:https://www.cnblogs.com/java-spring/p/10792062.html
Copyright © 2011-2022 走看看