在t1線程:synchronized(o1)鎖定了o1,只要它再能鎖定synchronized(o2);
就可以打印System.out.println("++++"+flag);
在t2線程:synchronized(o2)鎖定了o2,只要它再能鎖定synchronized(o1);
就可以打印System.out.println("++++"+flag);
可是o1被線t1鎖定了,在t2線程就不能再能鎖定synchronized(o1);
同理o2被線t2鎖定了,在t1線程就不能再能鎖定synchronized(o2);
可見相互衝突了,所以造成了t1和t2線程死鎖。
代碼:
public class Runner3 implements Runnable{
static Object o1 = new Object(),o2 = new Object();//創建兩個對象
int flag = 0 ;//標誌位
public void run(){
if(flag == 0){
synchronized(o1){
try{
Thread.sleep(5000);
} catch(Exception e){;}
synchronized(o2){
System.out.println("++++"+flag);
}
}
}
if(flag == 1){
synchronized(o2){
try{
Thread.sleep(5000);
} catch(Exception e){;}
synchronized(o1){
System.out.println( "---"+flag);
}
}
}
}
public static void main(String[] args){
Runner3 t1 = new Runner3();//創建一個線程t1
Runner3 t2 = new Runner3();//創建一個線程t2
t1.flag = 0 ;//設置標誌位
t2.flag = 1 ;//設置標誌位
new Thread(t1).start();//開啓線程t1
new Thread(t2).start();//開啓線程t2
}
}
程序將產生死鎖,所以不會有任何輸出