死锁

死锁

一、什么是死锁

在多线程编程中,死锁是一种严重的问题,它发生在两个或多个线程互相等待对方持有的资源,导致所有线程都无法继续执行。
这种情况会导致程序挂起,无法正常运行。

二、死锁的四个必要条件

死锁通常发生在以下四个条件同时满足时:

  1. 互斥条件:至少有一个资源被一个线程独占,其他线程不能同时使用该资源。
  2. 请求与保持条件:一个线程已经持有至少一个资源,但又请求另一个资源,而该资源被其他线程持有。
  3. 不剥夺条件:线程所获得的资源在未使用完之前不能被剥夺,只能在使用完后自行释放。
  4. 循环等待条件:存在一个线程等待队列,例如:线程A等待线程B持有的资源,而线程B等待线程A持有的资源,从而形成一个等待环。

三、示例:产生死锁

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
42
43
44
45
package com.camellia.thread.deadlock;

/**
* 死锁演示
*/
public class DeadlockDemo {
public static void main(String[] args) {
Object lock1 = new Object();
Object lock2 = new Object();
Thread t1 = new Thread(new MyRunnable(lock1,lock2));
Thread t2 = new Thread(new MyRunnable(lock1,lock2));
t1.start();
t2.start();
}
}

class MyRunnable implements Runnable {
private Object o1;
private Object o2;

public MyRunnable(Object o1, Object o2) {
this.o1 = o1;
this.o2 = o2;
}

@Override
public void run() {
if(Thread.currentThread().getName().equals("Thread-0")){
synchronized (o1){
//休眠一秒,构成死锁。
try {
Thread.sleep(1000);
synchronized (o2){}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}else{
//彼此相互等待对方掌握的资源,构成死锁。
synchronized (o2){
synchronized (o1){}
}
}
}
}