关于ConcurrentHashMap javadoc的说明

Rol*_*all 1 java concurrency map

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

检索操作(包括get)通常不会阻塞,因此可能与更新操作(包括put和remove)重叠.检索反映了最近完成的更新操作的结果.对于诸如putAll和clear之类的聚合操作,并发检索可能反映仅插入或删除某些条目.

为什么只有一些条目?

Col*_*n M 5

必须一起阅读第一部分和最后部分才有意义.打破它,我们得到:

  • 检索操作(包括get)通常不会阻塞,因此它们可能与更新操作重叠
  • 检索反映了最近完成的更新操作的结果

现在,考虑一下putAll(这是ConcurrentHashMap.java源)的情况:

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

请注意,它会在循环中将每个条目添加到地图中.如果您putAll使用100个条目进行调用,并且有50%的时间通过,则另一个线程会尝试get从地图中获取值,此时只有50个条目putAll可用.

具体来说:文档没有通知您特定条目将不可用,只是在您调用另一个线程之前可能无法完成整个聚合操作get,因为它们彼此不同步.