在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ 為什么這個死鎖問題刪除static就造不成死鎖?

為什么這個死鎖問題刪除static就造不成死鎖?

題目描述

這段代碼是可以執(zhí)行的,但是我刪除static Object o1 = new Object(), o2 = new Object();前面的static,死鎖問題就沒了,求解答?

相關(guān)代碼

public class TestDeadLock implements Runnable {
    int flag = 1;
    static Object o1 = new Object(), o2 = new Object();

    public static void main(String[] args) {
        TestDeadLock tdl1 = new TestDeadLock();
        TestDeadLock tdl2 = new TestDeadLock();
        tdl1.flag = 0;
        tdl2.flag = 1;
        Thread t1 = new Thread(tdl1);
        Thread t2 = new Thread(tdl2);
        t1.start();
        t2.start();
    }

    @Override
    public void run() {
        System.out.println("flag:" + flag);
        if (flag == 0) {
            synchronized (o1) {
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    // TODO: handle exception
                }
                synchronized (o2) {
                    System.out.println("0");
                }
            }
        }
        if (flag == 1) {
            synchronized (o2) {
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    // TODO: handle exception
                }
                synchronized (o1) {
                    System.out.println("1");
                }
            }
        }
        
    }
}
回答
編輯回答
乖乖瀦

因為在你使用static修飾以后o1 o2兩個實例是靜態(tài)實例,(在類被加載的時候就已經(jīng)創(chuàng)建),不管你創(chuàng)建多少個TestDeadLock對象,他們都是同一個,所以不同的TestDeadLock實力訪問的時候會造成鎖等待,從而導致死鎖的產(chǎn)生。
但是如果去除static這里的o1和o2只是成員屬性,所以當你new不同的TestDeadLock對象的時候,他們其實是不同的對象,互相之間根本不受到影響(雖然代碼層面看起來都是o1 o2,但實際程序運行的時候tdl1的o1 o2,和tdl2的o1 o2是不一樣的,完全無關(guān))

2017年6月6日 17:00
編輯回答
爆扎

如果不加static,那么tdl1和tdl2分別有各自的o1和o2,所以就不造成死鎖

2017年1月6日 16:22