2016-02-05 78 views
0

考慮線程同步方法下面的代碼和一個同步模塊線程與同步在java中

public class ThreadSynchronizationPartI { 
    public static int myValue=1; 
    public static void main(String [] args) 
    { 
     Thread t=new Thread(()-> 
     { 
      while(true) 
      { 
      updateBalance(); 
       } 
     }); 
     t.start(); 

     t=new Thread(()->{ 
     while(true) 
     { 
      monitorBalance(); 
     } 
     }); 
     t.start(); 
    } 
    public static synchronized void updateBalance(){ 
     System.out.println("start "+myValue); 
     myValue = myValue + 1; 
     // myValue = myValue - 1; 
     System.out.println("end "+myValue); 

    } 
    public static synchronized void monitorBalance(){ 
     int b=myValue; 
     if(b>1) 
     { 
      System.out.println("B is greater than 1 by"+(b-1)); 
      System.exit(1); 
     } 
    } 
} 

爲什麼它確實給下面的輸出: 開始1 結束2 開始2 結束3 開始3 端4 開始4 端5 開始5 端6 開始6 端7開始 end 8 B大於1 by 7

任何人都可以解釋一下嗎?

+0

因爲在結束打印聲明前,您已將1加入到我的價值 –

+1

您期望發生什麼? updateBalance和monitorBalance會同時運行嗎?使用線程意味着他們*可以*,不一定他們會*。 – Neil

+0

爲什麼codestops在8爲什麼不繼續? –

回答

1

程序的執行將從main()開始。最初,myValue的值是1,並且將創建一個新的線程t。直到條件成立,while循環將被執行。當控件達到updateBalance()時,它將跳轉到該方法,並且println()將打印myValue的值爲1.因此,輸出將是:start 1它會將myValue的值增加到+1,並將as結果下一個println()將打印輸出爲:end 2。當下一個線程的條件在while循環中爲真時,控制將在那裏傳輸。 monitorBalance()將被調用,並且b被初始化爲myValue的值。當條件b>1評估爲真時,它將打印:B is greater than 1 by (b-1)