2013-07-15 53 views
1

這不是很清楚,我在下面引用的最後一位:一個澄清的ConcurrentHashMap的javadoc

檢索操作(包括get)通常不會阻塞,因此,可以 與更新操作(重疊包括投資和去掉)。檢索 反映最近完成的更新操作 的結果。 對於像putAll和 這樣的總體操作清除,併發檢索可能反映了插入或刪除某些條目的只有 。

爲什麼只有一些條目?變化

回答

5

第一個和最後一個部分必須一起閱讀纔有意義。它分解,我們得到:

  • 檢索操作(包括get)通常不會阻塞,因此,他們可能與更新操作交迭
  • 反演反映最近完成的更新操作的結果保持在他們的發病現在

,考慮在putAll的情況下發生的事情(這是ConcurrentHashMap.java源):

for (Map.Entry<? extends K, ? extends V> e : m.entrySet()) 
    put(e.getKey(), e.getValue()); 

注意它將每個條目添加到循環中。如果您撥打putAll有100個條目和50%的路徑,另一個線程嘗試從地圖中獲取值get,那麼當時只有50個給出putAll的條目可用。

具體做法是:文檔未通知您具體項將不可用,只是整個集合操作可能是不完整你在另一個線程中調用get之前,因爲它們沒有相互同步。

0

只有「一些」可以看出,因爲另一個線程可以在的putAll()clear(),這都需要很多步驟才能完成,當它只是完成部分訪問地圖

0

putAllclear不是原子操作。因此,如果一個線程調用putAll來放置幾個條目,而另一個線程並行檢索值,則可能會看到putAll操作的中間狀態。在putAll方法完成之前,地圖不會阻塞。 (清除相同 - 值可以檢索清除操作並行運行)。