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

发布于:2023-02-04 ⋅ 阅读:(882) ⋅ 点赞:(0)

目录

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、解除死锁

与检测死锁配合使用


网站公告

今日签到

点亮在社区的每一天
去签到