1. 程式人生 > 其它 >Java中多執行緒的死鎖現象及演示一個死鎖案例

Java中多執行緒的死鎖現象及演示一個死鎖案例

技術標籤:JavaSE進階java多執行緒面試併發程式設計

文章目錄


前言

Java多執行緒中死鎖是一個重要內容,所以對於死鎖的理解非常重要。在面試過程中,經常會讓程式設計師寫一個死鎖案例。

一、什麼是死鎖

  • 我們舉一個生活中的例子,中國人和外國人一起吃飯,中國人使用筷子外國人使用叉子才能順利吃完飯。
  • 那麼什麼是死鎖現象呢?就是外國人拿著筷子,中國人拿著叉子,兩個人誰都不給誰,那麼,就會一直僵持,誰都吃不了飯。
  • 死鎖現象出現後,不會出現異常,也不會出現提示,只是所有的執行緒都會出現阻塞狀態,無法繼續。

二、死鎖案例

  1. 建立一個LockUtils介面
public
interface LockUtils { Object Obj1 = new Object(); Object Obj2 = new Object(); }
  1. 主程式
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鎖,輸出語句。兩個執行緒都在等待釋放資源,並且該資源被另外一個執行緒鎖定,導致每個執行緒都在等待物件執行緒釋放其鎖,從而產生死鎖現象。