繁体   English   中英

Java并发hashMap检索

[英]Java concurrent hashMap retrieval

ConcurrentHashMap文档说:

检索操作(包括get)通常不会阻塞,因此可能与更新操作(包括put和remove)重叠。 检索反映了自发生以来最新完成的更新操作的结果。 (更正式地说,给定键的更新操作与该键的任何(非空)检索报告更新后的值之间具有事前关联。)

但是我不明白如何对相同密钥的更新操作不阻止检索操作?

“给定密钥的更新操作与该密钥的任何(非空)检索都具有事前发生的关系”

这种表示并发哈希图以某种方式为同一键上的读取/更新/删除操作创建序列。 但这意味着读取操作被更新/删除操作阻止。

不知道我在这里想念的是什么。

但是我不明白如何对相同密钥的更新操作不阻止检索操作?

首先,“如何”实现是一个实现细节。 如果您确实希望/需要了解“如何”,则需要查看源代码。 它可以从各地购买。

但这实际上是在说:

  • get不会阻塞,并且
  • 进行getget是该密钥最近完成的 put操作的值。

所以,如果你做一个getput过程中,您可能会看到从以前的值put

需要注意的是第2点角度解释(隐含的),为什么有可能get是非阻塞的。 不需要get(42)等待当前正在进行的put(42, value)完成...因为允许get调用返回前一个值。

TL; DR-无需阻止。


有关“ 发生在……之前 ”关系的东西将其与Java内存模型的语义相关联。 如果您要对代码进行深入分析,这可能很重要。 但是对于ConcurrentHashMap功能有一个较浅的了解,您可以忽略它。

...表示并发哈希映射以某种方式为同一键上的读取/更新/删除操作创建序列。

完全没有暗示。 但是要了解您引用的语句的真正含义,您需要对Java内存模型有一个很好的了解。 而且,我认为在StackOverflow问答中将其传达给您是不可行的。 我建议您花一些时间阅读和理解JMM ...通过阅读JLS。 然后,再做一次。

这不是凭直觉就足够的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM