java線程死鎖程序

在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		
  	
        }
}

程序將產生死鎖,所以不會有任何輸出

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