我不太清楚以下引号的最后一点:


  检索操作(包括获取)通常不会阻塞,因此可能
  与更新操作(包括放置和删除)重叠。检索
  反映最近完成的更新操作的结果
  保持发病。对于聚合操作,例如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之前,整个聚合操作可能未完成,因为它们彼此不同步。

09-10 01:29