一、死鎖的規範定義
集合中的每一個進程都在等待只能由本集合中的其他進程才能引發的事件,那麼該組進程是死鎖的。
二、直觀的例子
兩個人吃飯,都需要刀和叉,但刀叉又只有一套。某時刻,其中一個人拿了刀,另一個拿了叉,而且兩人都在等待對方讓出自己需要的叉或刀。這種情形下,兩個人都只能一直等待下去,這就是發生了死鎖。
三、程序演示死鎖
static void deadLock() {
final Object knife = new Object();
final Object fork = new Object();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (knife) {
while (true) {
System.out.println(Thread.currentThread().getName() + " has knife");
synchronized (fork) {
System.out.println(Thread.currentThread().getName() + " get fork");
}
}
}
}
}, "Linda").start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (fork) {
while (true) {
System.out.println(Thread.currentThread().getName() + " has fork");
synchronized (knife) {
System.out.println(Thread.currentThread().getName() + " get knife");
}
}
}
}
}, "Lisa").start();
}
四、死鎖產生的必要條件
- 互斥條件:一個資源每次只能被一個進程使用。
- 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
- 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
- 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係。