死锁

死锁的四个必要条件

  1. 互斥:在一段时间内某资源仅为一进程所占用
  2. 请求与保持:当进程因请求资源而阻塞时,对已获得的资源保持不放
  3. 不可剥夺:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放
  4. 循环等待:在发生死锁时,必然存在一个进程–资源的环形链

预防和破坏死锁

  1. 资源一次性分配:如果某进程所需的资源能够一次分配完则分配,否则不分配
  2. 申请新资源,必须先释放所拥有的的其他资源,若还需要此资源,需向系统重新申请
  3. 申请新资源失败,释放所拥有的的所有资源
  4. 对资源进行编号,申请编号小的资源必须先释放所拥有的编号大的资源
  5. 当产生死锁时,强制结束一些进程

避免死锁

银行家算法

手写一个死锁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public static final String s1 = "s1";
public static final String s2 = "s2";

public static void main(String[] args) {
Thread aA = new Thread(()->{
try {
while (true){
synchronized (s1){
Thread.sleep(1000);
System.out.println("aA已获得s1");
synchronized (s2){
System.out.println("aA已获得s2");
break;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
});

Thread bB = new Thread(()->{
try {
while (true){
synchronized (s2){
Thread.sleep(1000);
System.out.println("bB已获得s2");
synchronized (s1){
System.out.println("bB已获得s1");
break;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
});

aA.start();
bB.start();
}