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());
}
}
即使下面的代碼,我的輸出還是一樣..'公共靜態無效的主要(字串[] 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}' –
你的每個線程只會增加計數器10次......你認爲這需要多長時間?我認爲這將在幾乎沒有時間完成。主線程啓動下一個所需的時間將會花費更多的時間!所以,你應該看到更多,更多,更高的價值來觀察這種影響。 –