thread 死锁

Java 线程锁死是多线程中的一个典型问题:两个线程相互等待对方释放锁资源,导致线程假死

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
public class DeadThread implements Runnable {

private String flag;

private Object lock1 = new Object();
private Object lock2 = new Object();

public void run() {
if ("a".equals(flag)) {
synchronized (lock1) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2) {
System.out.println("lock1 调用 lock2");
}
}
}

if ("b".equals(flag)) {
synchronized (lock2) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock1) {
System.out.println("lock2 调用 lock1");
}
}
}
}

public void setFlag(String flag) {
this.flag = flag;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
public class ThreadRunner {

public static void main(String[] args) {
DeadThread deadThread = new DeadThread();
deadThread.setFlag("a");
Thread thread1 = new Thread(deadThread);
thread1.start();
deadThread.setFlag("b");
Thread thread2 = new Thread(deadThread);
thread2.start();
}
}