這不是很清楚,我在下面引用的最後一位:一個澄清的ConcurrentHashMap的javadoc
檢索操作(包括get)通常不會阻塞,因此,可以 與更新操作(重疊包括投資和去掉)。檢索 反映最近完成的更新操作 的結果。 對於像putAll和 這樣的總體操作清除,併發檢索可能反映了插入或刪除某些條目的只有 。
爲什麼只有一些條目?變化
這不是很清楚,我在下面引用的最後一位:一個澄清的ConcurrentHashMap的javadoc
檢索操作(包括get)通常不會阻塞,因此,可以 與更新操作(重疊包括投資和去掉)。檢索 反映最近完成的更新操作 的結果。 對於像putAll和 這樣的總體操作清除,併發檢索可能反映了插入或刪除某些條目的只有 。
爲什麼只有一些條目?變化
第一個和最後一個部分必須一起閱讀纔有意義。它分解,我們得到:
,考慮在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
之前,因爲它們沒有相互同步。
只有「一些」可以看出,因爲另一個線程可以在的putAll()
或clear()
,這都需要很多步驟才能完成,當它只是完成部分訪問地圖。
putAll
和clear
不是原子操作。因此,如果一個線程調用putAll
來放置幾個條目,而另一個線程並行檢索值,則可能會看到putAll
操作的中間狀態。在putAll
方法完成之前,地圖不會阻塞。 (清除相同 - 值可以檢索而清除操作並行運行)。