线程死锁是什么

线程死锁是什么线程死锁:两个或两个以上的线程在执行过程中同时被阻塞,它们中的某个或者全部都在等待某个资源被释放,由于线程被无限期的阻塞,系统处于死锁状态或系统产生了死锁,这些永远在互相等待的线程被称为线程死锁如上图所示,线程A持有资源2,线程B持有资源1,它们都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态如果想要了解什么是线程阻塞的朋友,可以看我之前发的一篇线程的阻塞线程死锁示例代码如下:线程A通过synchronized(resource1)获得resource1的监视器锁,然后通

大家好,又见面了,我是你们的朋友全栈君。

线程死锁:

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

线程死锁是什么
线程死锁的演示

 如上图所示,线程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. 循环等待条件:当发生死锁时,所等待的线程(进程)必定会形成一个环路(类似于死循环),造成永久阻塞

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158542.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月13日 上午11:16
下一篇 2022年7月13日 上午11:16


相关推荐

  • MySQL添加新用户、为用户创建数据库、为新用户分配权限

    MySQL添加新用户、为用户创建数据库、为新用户分配权限

    2021年10月18日
    49
  • eplan激活码破解步骤【2021.7最新】

    (eplan激活码破解步骤)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月22日
    1.6K
  • Duilib介绍-3

    Duilib介绍-3自绘控件在 2013duilib 入门简明教程复杂控件介绍 13 中虽然介绍了界面设计器上的所有控件 但是还有一些控件并没有被放到界面设计器上 还有一些常用控件 duilib 并没有提供 比如菜单控件 虽然 duilib 没有提供这些控件 但是自己绘制起来也是非常方便的 不过 duilib 的自绘可比 MFC 方便得不止一点点了 其实 duilib 的自绘大都不用自己绘制 就是一些控件和图片的组合而已 相当简单方便 一 菜单控件其实菜单控件的外观和 ListBox 非常像 所以我们可以

    2026年3月18日
    2
  • 开车旅行游戏_开车周游世界

    开车旅行游戏_开车周游世界题目链接这道题最基本的思路是用倍增,但是其实它的难点在预处理部分。倍增的部分此次就不细说了,和之前的最近公共祖先的思想类似。我们主要来探讨一下预处理的部分。我们需要预处理出每个城市小A和小B的选择目标和对应的距离,接下来就可以处理出进行2k轮开车的目的地和距离了。所以前者才是重中之重,而前者如果要用暴力的方法会tle的。有人可能会疑惑,我们找当前点的后面两三个不就可以了?为什么会tle呢?实际上并不是序号相差很远距离就很远,实际上有可能第一个城市和最后一个城市最近,可以举个例子,城市海拔如下:

    2022年8月22日
    11
  • ValidateRequest=”false” 无效

    ValidateRequest=”false” 无效在做牛腩新闻发布系统的时候,部分同学

    2022年6月10日
    27
  • 关于C语言中fseek函数的使用

    关于C语言中fseek函数的使用关于 C 语言中

    2026年3月19日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号