1

我想了解線程同步。我已經實現了一個初始值爲0的計數器。每次有10個線程遞增計數器10次。我猜想下面的代碼的輸出必須是不是100的東西,因爲我沒有同步它。但我總是得到我的最終數量爲100,而不管我是否同步Counter.java中的incrementCount方法。有人可以解釋我怎麼能看到錯誤的輸出,因爲不同步?JAVA:如何查看同步和正常線程計數器之間的輸出差異?

package practise.java; 

public class Counter { 

    private int count = 0; 

    public int getCount() 
    { 
     return count; 
    } 

    public void incrementCount() 
    { 
     count++; 
    } 

} 


package practise.java; 

public class SharedCounter1 extends Thread{ 

    Counter counter; 

    public SharedCounter1(Counter c) 
    { 
     counter = c; 
    } 


    @Override 
    public void run() { 
     for(int i = 0;i<10;i++) 
     { 
      //System.out.println(this.getName() + "previous count :: "+counter.getCount()); 
      counter.incrementCount(); 
      //System.out.println("after incrementing ::: "+counter.getCount()); 

     } 
    } 

    public static void main(String[] args) 
    { 
     Counter c = new Counter(); 
     for(int i=0;i<10;i++) 
     { 
      System.out.println(i+"th thread starting"); 
      SharedCounter1 s= new SharedCounter1(c); 
      s.start();try { 
       s.join(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

     System.out.println("Final Value::: "+c.getCount()); 
    } 
} 

回答

1

你的線程依次執行:

 s.start(); 
     try { 
      s.join(); 

你開始thread,你等待,直到它完成,然後開始下一個thread。你應該開始的所有線程,然後等待,直到所有完成

+0

即使下面的代碼,我的輸出還是一樣..'公共靜態無效的主要(字串[] args)拋出InterruptedException的 \t { \t \t計數器C =新的Counter(); \t \t SharedCounter1 [] array = new SharedCounter1 [10]; \t \t對(INT I = 0; I <10;我++) \t \t { \t \t \t的System.out.println第(i + 「個線程開始」); \t \t \t array [i] = new SharedCounter1(c); \t \t \t array [i] .start(); \t \t} \t \t \t 爲\t(INT I = 0; I <10;我++) \t \t { \t \t \t陣列[I]。加入(); \t \t} \t \t \t \t的System.out.println( 「最終值:::」 + c.getCount()); \t}' –

+0

你的每個線程只會增加計數器10次......你認爲這需要多長時間?我認爲這將在幾乎沒有時間完成。主線程啓動下一個所需的時間將會花費更多的時間!所以,你應該看到更多,更多,更高的價值來觀察這種影響。 –