爲了瞭解通過Java進行同步的工作,我只是簡單地介紹一些簡單的事情,比如創建一個在線程間共享的計數器。使用AtomicInteger作爲靜態共享計數器
我遇到的問題是我無法弄清楚如何在100%的時間內連續打印計數器。
int counterValue = this.counter.incrementAndGet();
System.out.println(this.threadName + ": " + counterValue);
以上的增量AtomicInteger counter
,獲取新的價值,並打印到由負責該更新線程名稱標識的控制檯。當看到incrementAndGet()
方法導致JVM在打印當前線程的更新值之前上下文切換到另一個線程進行更新時,會出現問題。這意味着在線程返回到執行狀態之前,該值會遞增但不會打印。看着這個例子的輸出時,這是顯而易見的:
Thread 3: 4034
Thread 3: 4035
Thread 3: 4036
Thread 1: 3944
Thread 1: 4037
Thread 1: 4039
Thread 1: 4040
Thread 2: 3863
Thread 1: 4041
Thread 1: 4043
你可以看到,當執行返回到線程1,它打印的價值,並繼續更新。線程2也是如此。
我有一種感覺,我錯過了一些非常明顯的東西。
沒有特別的原因,我想除了我以外的其他順序輸出,只是爲了學習目的而混淆不同的同步場景。我想我現在也終於明白了synchronized塊。非常感謝。 – 2012-04-09 18:43:34
我認爲@ jskiles1。競爭條件可能會非常棘手和令人困惑。那裏有一堆很好的教程。這裏看起來不錯。祝你好運。 http://www.vogella.de/articles/JavaConcurrency/article.html – Gray 2012-04-09 18:48:51