2017-05-26 102 views
0

我有一個需求,我需要在完成時發佈'n'個線程的結果。爲了檢查所有線程是否完成,我使用AtomicInteger(incrementAndGet())並將其值與最終變量進行比較。在做檢查之前,我正在將單個線程的結果寫入共享對象(併發哈希表,因爲非同步數據結構dint似乎足夠了)。所以,我的問題是,在我的計數器通過'if'條件之前,所有線程是否會完整寫入共享對象(並且主線程是否能夠看到一致的內存)?原子變量是否能保證 - 「發生在關係之前」?

這裏的示例代碼:

公共無效的run(){

//Values is a concurrent hashMap. 
    values.put(Thread.currentThread().getName(), Thread.currentThread().getName()); 

    if(counter.incrementAndGet() == 5) { 
     //Do something 
    } 
} 
+2

爲什麼不使用'CountDownLatch'? – Bohemian

+0

不想要任何等待的線程。將計數器對象作爲監視器傳遞給所有正在執行的線程。 – V1666

+0

在使用一個時不必阻塞線程:'getCount()'返回當前計數。只有'await()'塊。 – Bohemian

回答

2

package summaryjava.util.concurrent.atomic

用於訪問和原子能的更新通常遵循規則的記憶效應用於揮發物,如The Java Language Specification (17.4 Memory Model)中所述:

  • get具有讀取volatile變量的記憶效應。
  • set具有寫入(分配)volatile變量的記憶效應。

incrementAndGet()既包括set和get操作,這意味着你有一個完整的之前發生邊緣。

+0

驚人的讀取文檔是多麼有用! –

+0

謝謝。所以,將繼續採用這種方法。 – V1666

相關問題