程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> 線程-static Object obj = new Object(),靜態對象和非靜態對象有什麼區別

線程-static Object obj = new Object(),靜態對象和非靜態對象有什麼區別

編輯:編程綜合問答
static Object obj = new Object(),靜態對象和非靜態對象有什麼區別

下面你這段程序中,Object不用static 修飾時不會產生死鎖,加上static就會產生死鎖,為什麼會這樣呢?

 public class TestDeadLock implements Runnable{
     static Object o1 = new Object();     //在Object前面加static與不加對synchronized有什麼影響,為什麼執行結果不一樣
     static Object o2 = new Object();    //synchronized參數都可以是什麼
     public  int flag = 0;
    public static void main(String[] args){
        TestDeadLock td1 = new TestDeadLock();
        TestDeadLock td2 = new TestDeadLock();
        td1.flag=1;
        td2.flag=0;
        Thread t1 = new Thread(td1);
        Thread t2 = new Thread(td2);
        t1.start();
        t2.start();
    }

    public void run(){
        System.out.println("flag="+flag);
        if(flag==0){
            synchronized(o1){
                try{
                    Thread.sleep(1000);
                }catch(InterruptedException e){
                    e.printStackTrace();
                    }

                synchronized(o2){
                    System.out.println("hello");
                }
            }
        }
        if(flag==1){
            synchronized(o2){
                try{
                    Thread.sleep(1000);
                }catch(InterruptedException e){
                    e.printStackTrace();
                    }

                synchronized(o1){
                    System.out.println("ok");
                }
            }
        }
    }
}



最佳回答:


你在鎖定o1的代碼塊內鎖定o2,在鎖定o2的代碼塊內鎖定o1
因此,如果兩個線程並發各自鎖住了o1 o2,並且試圖去鎖對方,那麼程序死鎖

而不加static,每個線程有一個自己的實例,鎖的不是同一個o1 o2

wuya814070935
onlymuxia
devmiao
zoulonglong
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved