我不太清楚以下引号的最后一点:
检索操作(包括获取)通常不会阻塞,因此可能
与更新操作(包括放置和删除)重叠。检索
反映最近完成的更新操作的结果
保持发病。对于聚合操作,例如putAll和
清楚的是,并发检索可能仅反映插入或删除
一些条目。
为什么只输入一些条目?
最佳答案
第一部分和最后一部分必须一起阅读才能理解。分解,我们得到:
检索操作(包括获取)通常不会阻塞,因此它们可能与更新操作重叠
检索反映了刚发生时最新完成的更新操作的结果
现在,考虑在putAll
情况下会发生什么(这是ConcurrentHashMap.java源代码):
for (Map.Entry<? extends K, ? extends V> e : m.entrySet())
put(e.getKey(), e.getValue());
请注意,它会将每个条目循环添加到地图中。如果您以100个条目的方式调用
putAll
,并且在整个过程的50%内调用另一个线程尝试从映射中get
一个值,那么当时提供给putAll
的条目中只有50个可用。特别是:文档并没有通知您特定的条目将不可用,只是在您在另一个线程中调用
get
之前,整个聚合操作可能未完成,因为它们彼此不同步。