Java中多執行緒的死鎖現象及演示一個死鎖案例
阿新 • • 發佈:2021-01-21
文章目錄
前言
Java多執行緒中死鎖是一個重要內容,所以對於死鎖的理解非常重要。在面試過程中,經常會讓程式設計師寫一個死鎖案例。
一、什麼是死鎖
- 我們舉一個生活中的例子,中國人和外國人一起吃飯,中國人使用筷子外國人使用叉子才能順利吃完飯。
- 那麼什麼是死鎖現象呢?就是外國人拿著筷子,中國人拿著叉子,兩個人誰都不給誰,那麼,就會一直僵持,誰都吃不了飯。
- 死鎖現象出現後,不會出現異常,也不會出現提示,只是所有的執行緒都會出現阻塞狀態,無法繼續。
二、死鎖案例
- 建立一個LockUtils介面
public interface LockUtils {
Object Obj1 = new Object();
Object Obj2 = new Object();
}
- 主程式
public class 死鎖現象 implements LockUtils {
public static void main(String[] args) {
MyThread10 th1 = new MyThread10(true);
MyThread10 th2 = new MyThread10(false);
th1.start();
th2. start();
}
}
class MyThread10 extends Thread {
private boolean flag;
public MyThread10(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
if (flag) {
//同步程式碼塊巢狀
synchronized (LockUtils.Obj1) {
System.out.println ("true執行緒持有obj1鎖,進來了");
synchronized (LockUtils.Obj2) {
System.out.println("true執行緒持有obj2鎖,進來了");
}
}
} else {
synchronized (LockUtils.Obj2) {
System.out.println("false執行緒持有obj2鎖,進來了");
synchronized (LockUtils.Obj1) {
System.out.println("false執行緒持有obj1鎖,進來了");
}
}
}
}
}
執行結果:
true執行緒拿了obj1鎖,輸出語句。false執行緒拿了obj2鎖,輸出語句。兩個執行緒都在等待釋放資源,並且該資源被另外一個執行緒鎖定,導致每個執行緒都在等待物件執行緒釋放其鎖,從而產生死鎖現象。