死锁
1. 什么是死锁?
死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的互相等待的现象, 在无外力作用的情况下,这些线程会一直相互等待而无法继续运行下去。
2. 死锁产生的必要条件
- 互斥条件:该资源同时只由一个线程占用,此时如果有其他线程访问,请求者只能等待,直至占有者释放。
- 循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系。
- 请求并保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。
- 不可剥夺条件:线程已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。
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. 如何避免死锁
避免死锁,只需要破坏四个必要条件其中一个即可,通过