java一段死鎖的代碼

死鎖是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。

public class ShareObject1 {}
public class ShareObject2 {}
public class Thread1 extends Thread {
    @Override
    public void run() {
        synchronized (ShareObject1.class) {
            System.out.println("線程1獲取到 ShareObject1 的鎖");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (ShareObject2.class) {
                System.out.println("線程1獲取到 ShareObject2 的鎖");
            }
        }
    }
}
public class Thread2 extends Thread {
    @Override
    public void run() {
        synchronized (ShareObject2.class) {
            System.out.println("線程2獲取到 ShareObject2 的鎖");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (ShareObject1.class) {
                System.out.println("線程2獲取到 ShareObject1 的鎖");
            }
        }
    }
}
public class Test {

    public static void main(String[] args) {
        new Thread1().start();
        new Thread2().start();
    }
}

運行main得到如下結果:

在上述代碼中,線程Thread1首先獲取到ShareObjectl的鎖,然後再去嘗試獲取ShareObject2的鎖:此時線程Thread2已經獲取到ShareObject2的鎖,繼續嘗試去獲取ShareObject1的鎖。這樣兩個線程都需要得到對方已經佔有的資源後才能繼續運行,因此,會導致死鎖。造成死鎖的主要原因是兩個線程請求資源的順序不合理,如果這兩個線程採用同樣的順序獲取,那麼就不會出現死鎖。

參考文獻:《Java程序員面試筆試真題與解析》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章