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
    
                }
            }
        }
    }
  • 相关阅读:
    热修复之类加载机制总结
    socket之tcp如何维护长连接
    sqlite之多线程处理
    android主线程ActivityThread-转载
    线程之ThreadLocal使用
    图片之压缩总结
    线程之交替执行的实例
    git的最常用命令总结
    sqlite之常见的语句
    activity之分析-3分钟看懂Activity启动流程
  • 原文地址:https://www.cnblogs.com/java-spring/p/10792062.html
Copyright © 2011-2022 走看看