Skip to content

死锁介绍

一、死锁

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

二、死锁产生的必要条件

  1. 互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
  2. 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
  3. 不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
  4. 环路等待条件:在发生死锁时,必然存在一个进程--资源的环形链。

三、解决死锁的方法

  • 资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)
  • 只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏请保持条件)
  • 可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
  • 资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)

四、死锁的产生(代码)

/**
 * @Description 死锁demo
 * @Author lcy
 * @Date 2020/9/1 14:15
 */
public class DeadLockDemo {

    private static final  String  LOCK_A = "LOCK_A";
    private static final  String  LOCK_B = "LOCK_B";

    public static void main(String[] args){
        new Thread(()->{
            synchronized (LOCK_A){
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (LOCK_B){
                    System.out.println("线程1获取到了AB资源");
                }
            }
        }).start();
        new Thread(()->{
            synchronized (LOCK_B){
                synchronized (LOCK_A){
                    System.out.println("线程2获取到了AB资源");
                }
            }
        }).start();
    }


}

五、查看java的进程

在cmd命令里执行jconsole,打开控制台。选择相应的项目,点击不安全连接,进入找到线程列表,左下角查看检查死锁,就能找到死锁的线程。