我是靠谱客的博主 清秀指甲油,最近开发中收集的这篇文章主要介绍线程死锁是什么,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

线程死锁:

两个或两个以上的线程在执行过程中同时被阻塞,它们中的某个或者全部都在等待某个资源被释放,由于线程被无限期的阻塞,系统处于死锁状态或系统产生了死锁,这些永远在互相等待的线程被称为线程死锁

线程死锁的演示

 如上图所示,线程A持有资源2,线程B持有资源1,它们都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态

 如果想要了解什么是线程阻塞的朋友,可以看我之前发的一篇线程的阻塞

线程死锁示例代码如下:

public class Demo {

    private static Object resource1 = new Object();    //资源 1
    private static Object resource2 = new Object();    //资源 2

    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (resource1) {
                System.out.println(Thread.currentThread() + "get resource1");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "waiting get resource2");
                synchronized (resource2) {
                    System.out.println(Thread.currentThread() + "get resource2");
                }
            }
        }, "线程 1").start();
        new Thread(() -> {
            synchronized (resource2) {
                System.out.println(Thread.currentThread() + "get resource2");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "waiting get resource1");
                synchronized (resource1) {
                    System.out.println(Thread.currentThread() + "get resource1");
                }
            }
        }, "线程 2").start();
    }
}

输出结果:
Thread[线程 1,5,main]get resource1
Thread[线程 2,5,main]get resource2
Thread[线程 1,5,main]waiting get resource2
Thread[线程 2,5,main]waiting get resource1

线程 A 通过 synchronized (resource1) 获得 resource1 的监视器锁,然后通过Thread.sleep(1000);让线程 A 休眠 1s 为的是让线程 B 得到CPU执行权,然后获取到 resource2 的监视器锁。线程 A 和线程 B 休眠结束了都开始企图请求获取对方的资源,然后这两个线程就会陷入互相等待的状态,这也就产生了死锁

 不了解synchronized的友友们,可以翻我之前的一篇关于synchronized

形成死锁的四个必要条件:

  1. 互斥条件:线程(进程)对于所分配到的资源具有排它性,即一个资源只能被一个线程(进程)占用,直到被该线程(进程)释放
  2. 请求与保持条件:一个线程(进程)因请求资源而被阻塞时,对以获得的资源保持不放
  3. 不剥夺条件:线程(进程)已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源
  4. 循环等待条件:当发生死锁时,所等待的线程(进程)必定会形成一个环路(类似于死循环),造成永久阻塞

实际应用中,为了避免线程死锁,必须打破其中一个条件:

  • 互斥条件没有办法破坏,因为我们用锁本来就是想让它们互斥的(临界资源需要互斥访问)
  • 破坏请求与保持条件,一次性申请所有资源
  • 破坏不剥夺条件,占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放该线程占有的资源
  • 破坏循环等待条件,按某一顺序申请资源来预防死锁,释放资源则按此顺序的反序来释放

大家有不理解可以翻我博客哦!

最后

以上就是清秀指甲油为你收集整理的线程死锁是什么的全部内容,希望文章能够帮你解决线程死锁是什么所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部