下面你這段程序中,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