如何避免线程死锁呢?

乔欣 Java面经 发布时间:2022-11-10 22:31:04 阅读数:9370 1 并发编程面试题(2023最新版)
下文笔者讲述避免死锁的方法分享,如下所示
我们打破死锁产生的条件,即可避免死锁

一、破坏互斥条件
         临界资源需要互斥访问

二、破坏请求与保持条件
      一次性申请所有的资源
      会降低并发能力
      一般不破坏请求与保持条件

三、破坏不剥夺条件
    占用部分资源的线程进一步申请其他资源时
     如果申请不到
     可以主动释放它占有的资源

四、破坏循环等待条件
    靠按序申请资源来预防
    按某一顺序申请资源
     释放资源则反序释放
例:
不会产生死锁的代码
 
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");
      }
  }
}, "线程 2").start();

----运行以上代码,将输出以下信息-----
Thread[线程 1,5,main]get resource1
Thread[线程 1,5,main]waiting get resource2
Thread[线程 1,5,main]get resource2
Thread[线程 2,5,main]get resource1
Thread[线程 2,5,main]waiting get resource2
Thread[线程 2,5,main]get resource2
以上代码的运行流程:

线程 1 首先获得到 resource1 的监视器锁
   此时线程 2 无法获取
   然后线程 1 再去获取 resource2 的监视器锁,可以获取到
   然后线程 1 释放了对 resource1、resource2 的监视器锁的占用
    线程 2 获取到就可以执行
      此处破坏循环等待条件,所以可以避免死锁
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaMianJing/202211/16680912244860.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者