死锁

118 阅读1分钟

死锁

1. 什么是死锁?

死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的互相等待的现象, 在无外力作用的情况下,这些线程会一直相互等待而无法继续运行下去。

2. 死锁产生的必要条件

  1. 互斥条件:该资源同时只由一个线程占用,此时如果有其他线程访问,请求者只能等待,直至占有者释放。
  2. 循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系。
  3. 请求并保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。
  4. 不可剥夺条件:线程已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。

3. 在 Java 中编写一个死锁代码

public class Main {
    public static final Object a = new Object();
    public static final Object b = new Object();
​
    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (a) {
                System.out.println("get a");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (b) {
                    System.out.println("get B");
                }
            }
        }, "t1").start();
        new Thread(() -> {
            synchronized (b) {
                System.out.println("get B");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (a) {
                    System.out.println("get a");
                }
            }
        }, "t2").start();
    }
}

执行上面代码,程序会一直运行无法结束,原因如下:

  • 资源 a, b 都是互斥资源

4. 如何避免死锁

避免死锁,只需要破坏四个必要条件其中一个即可,通过