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 - 如何用java分割wmv文件

java - 在java上执行.exe,需要一些库

python - 从数据帧创建一个字典,第一列作为键,其余作为值

python - 解析列表中的 Python 字典

c# - 我如何知道此 C# 方法是否线程安全?

java - Android 4.4 KitKat - SharedPreferences 返回 INSTALL_FAILED_SHARED_USER_INCOMPATIBLE

java - 检测新的 SMS/MMS 消息 Android 应用程序

python - 创建表并从字典中的列表中排序数据

java - ConcurrentHashMap 使用线程 A 进行remove(),同时使用线程 B 进行迭代

java - Java 中的递归感知线程池?