Java——死锁及死锁的处理策略

目录

1、什么是死锁?

2、代码演示

3、死锁的四个必要条件

4、处理死锁的四种策略


1、什么是死锁?

当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他同步。这时会引发一种现象:程序出现无限等待,这种现象我们称为死锁。简单理解:指两个线程或多个线程相互持有对方所需要的资源,导致线程都处于等待状态,无法往下执行,这就是死锁!

2、代码演示

public class DicLock extends Thread {
    //定义boolean类型变量控制程序入口
    private boolean flag;

    public DicLock(boolean flag) {
        this.flag = flag;
    }

    @Override
    public void run() {
          //如果为true,则先执行objA,flase则执行objB
          if(flag){
              synchronized (MyLock.objA){
                  System.out.println("if objA");
                synchronized (MyLock.objB){
                  System.out.println("if objB");
                }
              }
          //false则进入
          }else{
              synchronized (MyLock.objB){
                  System.out.println("else objB");
                  synchronized (MyLock.objA){
                      System.out.println("if objA");
                  }
              }
          }
    }
}
public class MyLock {
    //创建两个锁对象
    public static final Object objA = new Object();
    public static final Object objB = new Object();
}
//测试类
public class Test {
    public static void main(String[] args) {
        //创建对象传递true,执行objA
        DicLock d1=new DicLock(true);
        d1.start();
        //创建对象传递false,执行objB
        DicLock d2=new DicLock(false);
        d2.start();
    }
}

发现程序一直在进行着,并没有执行完毕,可见是发生了死锁,objA在等待objB执行完毕,而objB在等待objA执行完毕,这样objA和objB会一直等待对方,谁也不让步,则发生死锁。

3、死锁的四个必要条件

1、互斥条件:一个资源每次只能被一个进程使用。

2、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

3、不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

4、循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

4、处理死锁的四种策略

1、预防死锁

通过设置一些限制条件,去破坏产生死锁的必要条件(见3、死锁的四个必要条件)

2、避免死锁

在资源分配过程中,使用某种方法避免系统进入不安全的状态,从而避免发生死锁

3、检测死锁

允许死锁的发生,但是通过系统的检测之后,采取一些措施,将死锁清除掉

4、解除死锁

与检测死锁配合使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以采取以下几种方法来避免死锁的发生: 1. 避免循环等待:确保线程获取锁的顺序是一致的,避免出现循环等待的情况。可以通过对锁进行排序,按照相同的顺序获取锁,从而避免循环等待。 2. 设置超时时间:在获取锁的时候设置一个超时时间,如果在规定时间内无法获取到锁,就放弃获取锁,避免长时间等待导致死锁。 3. 使用tryLock()方法:在获取锁的时候使用tryLock()方法,该方法会尝试获取锁,如果获取成功则继续执行,如果获取失败则立即释放锁,避免长时间等待。 4. 使用Lock对象:使用Lock对象代替synchronized关键字来进行锁的管理,Lock对象提供了更灵活的锁操作,可以使用tryLock()方法和lockInterruptibly()方法来避免死锁。 5. 使用线程池:使用线程池来管理线程的创建和销毁,避免频繁地创建和销毁线程,从而减少死锁的可能性。 总之,避免死锁的关键是合理设计锁的获取顺序,并且避免长时间等待和循环等待的情况发生。以上是一些常见的方法,但具体的避免死锁策略还需要根据具体的场景和需求来确定。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [Java开发之——线程面试篇:死锁和如何避免死锁?](https://blog.csdn.net/weixin_43802541/article/details/122479319)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值