美文网首页线程
死锁的产生和避免

死锁的产生和避免

作者: 梦想实现家_Z | 来源:发表于2019-03-16 00:38 被阅读0次

1.什么是死锁
多个进程或者线程相互等待对方的资源,在未得到对方资源之前,都不会释放自己的资源,就造成了相互等待的现象。

java代码示例:

public class Main {

    /**
     * 资源1
     */
    private static final Object OBJ_1 = new Object();
    /**
     * 资源2
     */
    private static final Object OBJ_2 = new Object();

    /**
     * 死锁演示
     */
    private static void deadLock() {
        //线程1
        Thread t1 = new Thread(() -> {
            //获取资源1
            synchronized (OBJ_1) {
                System.out.println(Thread.currentThread().getName() + "获取资源1");
                //睡眠2秒,保证在线程2拿到资源2
                sleep(2000);
                //获取资源2
                synchronized (OBJ_2) {
                    System.out.println(Thread.currentThread().getName() + "获取资源2");
                }
            }
        });

        //线程2
        Thread t2 = new Thread(() -> {
            //获取资源2
            synchronized (OBJ_2) {
                System.out.println(Thread.currentThread().getName() + "获取资源2");
                //睡眠2秒,保证在线程1拿到资源1
                sleep(2000);
                //获取资源1
                synchronized (OBJ_1) {
                    System.out.println(Thread.currentThread().getName() + "获取资源1");
                }
            }
        });
        //启动两个线程
        t1.start();
        t2.start();
    }

    /**
     * 睡眠
     *
     * @param millis
     */
    private static void sleep(long millis) {
        try {
            Thread.sleep(millis);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 主函数
     * @param args
     */
    public static void main(String[] args) {
        deadLock();
    }
}

2.死锁的四个必要条件
条件1:资源的互斥性,一个资源同一时刻只能被一个进程或线程占有
条件2:请求与保持,一个进程或线程在申请新资源的同时保持对原有资源的占有
条件3:不可剥夺,资源申请者不能从资源占有者手中夺取资源,只能由占有者自由释放。
条件4:循环等待,多个进程或线程相互等待对方已占有的资源。

3.如何预防死锁
避免死锁的方法就是破坏它成立的条件。 只要破坏必要条件中的一个,即可避免死锁的产生。

  1. 首先,资源的互斥性是必须要保持的,互斥性是非共享资源的特性。非共享资源就是进程或线程需要去抢占的资源。
    2.我们只能从其他三个条件入手。
    破坏条件2:当一个进程或线程在请求资源的时候,它需要释放已占有的资源。
    破坏条件3:当一个进程或线程在一定时间内无法请求到资源的时候,需要释放自身所占有的资源。
    破坏条件4:规范进程或线程请求资源的顺序,按照相同顺序请求资源,避免循环等待。

4避免死锁的方法
1.一次性锁定所有需要的资源
2.所有进程或线程按照相同顺序加锁
3.银行家算法

相关文章

  • 死锁的产生和避免

    1.什么是死锁多个进程或者线程相互等待对方的资源,在未得到对方资源之前,都不会释放自己的资源,就造成了相互等待的现...

  • java多线程笔记

    产生死锁的四个必要条件 处理死锁的基本方法 死锁预防 死锁避免 死锁检测 死锁解除 https://blog.cs...

  • java并发--java死锁

    本篇结构: 前言 什么是死锁 产生死锁的必要条件 死锁的代码示例 死锁排查 如何避免死锁 总结 一、前言 今天被问...

  • JavaEE面试题总结 Day39 2018-12-29

    什么是线程死锁?死锁如何产生?如何避免线程死锁? 死锁的介绍: 线程死锁是指由于两个或者多个线程互相持有对方所需要...

  • Java死锁

    什么是死锁 死锁检测 产生死锁的四个必要条件 如何避免死锁 死锁 死锁,指两个或多个线程之间,由于互相持有对方需要...

  • 解决死锁的4种基本方法(值得收藏)

    解决死锁的4种基本方法(文末有惊喜) 1、预防死锁:通过设置一些限制条件,去破坏产生死锁的必要条件 2、避免死锁:...

  • 死锁

    第11章:死锁和进程通信 死锁概念 死锁处理方法 死锁预防(Deadlock Prevention) 死锁避免(D...

  • 死锁

    线程饥饿死锁 锁顺序死锁 动态锁顺序死锁通过锁顺序来避免死锁 避免死锁

  • Java死锁检测方式JConsole

    Java死锁检测方式之JConsole 我们在开发中应该尽量避免死锁,但是如果真的有死锁产生那么我们怎么在一个复杂...

  • 多线程死锁的产生以及如何避免死锁

    转载自 https://blog.csdn.net/ls5718/article/details/51896159...

网友评论

    本文标题:死锁的产生和避免

    本文链接:https://www.haomeiwen.com/subject/abzdmqtx.html