死锁就是:一个宝藏需要两把钥匙来打开,同时间正好来了两个人,他们一人一把钥匙,但是双方都再等对方能交出钥匙来打开宝藏,谁都没交出自己的那把钥匙.就这样这俩人一直僵持下去,直到开发人员发现这个局面.

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

private int trainCount = 100;
private final Object lock = new Object();
public boolean flag;

@Override
public void run() {
while (true) {
if (flag) {
synchronized (lock) {
sell1();
System.out.println(Thread.currentThread().getName() + " 拿到lock锁");
}
} else {
sell1();
}
}
}

public synchronized void sell1() {
System.out.println(Thread.currentThread().getName() + " 拿到this锁");
synchronized (lock) {
System.out.println(Thread.currentThread().getName() + " 拿到lock锁");
if (trainCount > 0) {
System.out.println(Thread.currentThread().getName() + " Sell a ticket:" + (100 - trainCount + 1));
trainCount--;
}
}
}


public static void main(String[] args) {
ThreadTest threadTest = new ThreadTest();
Thread thread = new Thread(threadTest, "窗口①");
Thread thread2 = new Thread(threadTest, "窗口②");
thread.start();
threadTest.flag = true;
thread2.start();

}
}

上面代码就是一个死锁
导致死锁的原因在于
线程①先拿到同步函数的this锁,在拿到同步代码块中的lock锁
线程②先拿到同步代码块中的lock锁,在拿到同步函数的this锁
互补释放锁导致的

解决死锁的方法:
不要嵌套同步代码块