1.4 编写一个死锁
让我们以🧩有趣的方式来探讨死锁吧!这个问题真的很经典,死锁的四个条件我们都可以背得滚瓜烂熟。但现在,让我们不仅背它们,还要写一个死锁出来,看看它是如何在代码中发生的。思路是这样的:我们定义了两个ArrayList,然后让它们同时拿着锁A和锁B。接着,有两个线程,一个是线程1,一个是线程2。线程1先拿住了锁A,然后请求锁B,而线程2拿住了锁B,请求锁A。这就像两个人相互卡住不让对方通过,结果就是谁也不愿意放弃已经拿到的锁。
```java
public class DeadLock {
public static void main(String[] args) {
final List list1 = Arrays.asList(1, 2, 3);
final List list2 = Arrays.asList(4, 5, 6);
new Thread(new Runnable() {
@Override
public void run() {
synchronized (list1) {
for (Integer i : list1) {
System.out.println(i);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (list2) {
for (Integer i : list2) {
System.out.println(i);
}
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (list2) {
for (Integer i : list2) {
System.out.println(i);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (list1) {
for (Integer i : list1) {
System.out.println(i);
}
}
}
}
}).start();
}
}
```
这段代码就像两个人互相拿着两把锁,然后又试图拿对方的锁,结果卡住了。运行这段代码,你会看到死锁发生了,两个线程都无法继续执行下去,就像两个🤝握手的人都不松开一样,这就是死锁的奇妙之处!希望这个例子能帮助你更好地理解死锁的概念和发生原因。🔒💥
标签: