java - 关于 ConcurrentHashMap javadoc 的说明

标签 java dictionary concurrency

以下引述的最后一点我不是很清楚:

Retrieval operations (including get) generally do not block, so may overlap with update operations (including put and remove). Retrievals reflect the results of the most recently completed update operations holding upon their onset. For aggregate operations such as putAll and clear, concurrent retrievals may reflect insertion or removal of only some entries.

为什么只有一些条目?

最佳答案

第一部分和最后一部分必须一起阅读才能理解。分解它,我们得到:

  • 检索操作(包括获取)一般不会阻塞,因此它们可能与更新操作重叠
  • 检索反射(reflect)了最近完成的更新操作的结果在它们开始时保持不变

现在,考虑在 putAll 的情况下会发生什么(这是 ConcurrentHashMap.java 源代码):

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

注意它在循环中将每个条目添加到 map 中。如果您使用 100 个条目调用 putAll,并且完成了 50%,另一个线程尝试从 map 中获取一个值,只有 50 个条目提供给 putAll 将在那时可用。

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

关于java - 关于 ConcurrentHashMap javadoc 的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17655244/

相关文章:

java - Oracle SQL Developer 无法启动,提示没有 j2SE SDK

Java并发HashMap

concurrency - Java 8 thenApply() 和 thenAccept()

Java Swing : Failed to create resources from application bundle. 使用基于 Java 的资源

java - 从不同类中的其他方法调用数组

java - android list 中的多个应用程序

python - 如何在不丢失重复值的情况下从两个列表创建字典?

python - 列表元素与字典键之间的比较

arrays - 用字典应用 Array.map

java - 让它漂亮 : processing an array concurrently