java多執行緒死鎖案例(程式碼案例)

2020-10-26 14:00:36

java多執行緒死鎖案例(程式碼案例)

什麼是死鎖

  • 當一個執行緒擁有A物件鎖,並等待B物件鎖的時候,另一個執行緒擁有B物件鎖,並等待A物件鎖,這就造成了死鎖。
  • 一個執行緒可以同時擁有多個物件的鎖標記,當執行緒阻塞時,不會釋放已經擁有的鎖標記,也可能會造成死鎖。

案例介紹:

假如宿舍只剩一雙鞋,這時候小明和小朋兩個人都要出去,兩個人一個拿到了左腳鞋子,一個人拿到了右腳鞋子,可是誰也不讓給誰,於是乎就造成了死鎖現象,誰也別出去了。

package com.nxw.Thread.dieLock;

public class DieLock{

    public static void main(String[] args) {
        Runnable xiaoming = new Runnable() {
            public void run() {
                synchronized (Shoes.left){
                    System.out.println("小明拿到了左腳鞋子");
                    synchronized (Shoes.right){
                        System.out.println("小明拿到了右腳鞋子,他可以穿鞋子走人了。。。");
                    }
                }
            }
        };

        Runnable xiaopeng = new Runnable() {
            public void run() {
                synchronized (Shoes.right){
                    System.out.println("小朋拿到了右腳鞋子");
                    synchronized (Shoes.left){
                        System.out.println("小朋拿到了左腳鞋子,他可以穿鞋子走人了。。。");
                    }
                }
            }
        };

        Thread thread1 = new Thread(xiaoming,"小明");
        Thread thread2 = new Thread(xiaopeng,"小朋");

        thread1.start();
        thread2.start();
    }


}

class Shoes {
    public static String left = "leftShoes";
    public static String right = "rightShoes";
}

為了方便貼程式碼,都寫到一個類裡面了。
多執行幾次你就會發現,當小明和小朋正好一個搶到一個鞋子的時候,死鎖就出現了。
在這裡插入圖片描述

所以我們在工作當中操作多執行緒的時候一定要注意避免死鎖的情況發生!