多線程與死鎖

死鎖

    死鎖發生的情況:創建兩個字節數組LockA和LockB,再創建兩個線程A和B,讓每個線程都用synchronized鎖住字節數組(A先鎖LockA,再嘗試去鎖定LockB;B先鎖LockB,再嘗試鎖定鎖定LockA),如果A鎖住LockA,B鎖住LockB,A就沒辦法鎖住LockB,B也沒辦法鎖住LockB,兩者相互等待,這時就陷入了死鎖。


代碼示例

package cn.edu.pzhu;

public class DeadLock {
    //這種定義從一個大佬那兒學的
    public static byte LockA[] = new byte[0];
    public static byte LockB[] = new byte[0];

    public static void main(String[] args) {
        new Thread(new A()).start();
        new Thread(new B()).start();
    }
}

class A implements Runnable {
    @Override
    public void run() {
        try {
            System.out.println("A 準備鎖定 LockA");
            synchronized (DeadLock.LockA) {
                System.out.println("A 把 LockA 鎖定");
                Thread.sleep(1000); // 讓A等一會,讓B有時間鎖定LockB
                System.out.println("A 嘗試鎖定 LockB");
                synchronized (DeadLock.LockB) {
                    System.out.println("A 把LockB鎖定");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("A的鎖釋放");
    }
}

class B implements Runnable {
    @Override
    public void run() {
        try {
            System.out.println("LockB 準備鎖定");
            synchronized (DeadLock.LockB) {
                System.out.println("B 把 LockB 鎖定");
                System.out.println("B 嘗試鎖定 LockA");
                synchronized (DeadLock.LockA) {
                    System.out.println("B 把 LockA 鎖定 ");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("B的鎖釋放");
    }
}

運行結果

運行結果

如有不當之處歡迎指出!

發佈了417 篇原創文章 · 獲贊 54 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章