[英]Java concurrent hashMap retrieval
ConcurrentHashMap
文档说:
检索操作(包括get)通常不会阻塞,因此可能与更新操作(包括put和remove)重叠。 检索反映了自发生以来最新完成的更新操作的结果。 (更正式地说,给定键的更新操作与该键的任何(非空)检索报告更新后的值之间具有事前关联。)
但是我不明白如何对相同密钥的更新操作不阻止检索操作?
“给定密钥的更新操作与该密钥的任何(非空)检索都具有事前发生的关系”
这种表示并发哈希图以某种方式为同一键上的读取/更新/删除操作创建序列。 但这意味着读取操作被更新/删除操作阻止。
不知道我在这里想念的是什么。
但是我不明白如何对相同密钥的更新操作不阻止检索操作?
首先,“如何”实现是一个实现细节。 如果您确实希望/需要了解“如何”,则需要查看源代码。 它可以从各地购买。
但这实际上是在说:
get
不会阻塞,并且 get
时get
是该密钥最近完成的 put
操作的值。 所以,如果你做一个get
而put
过程中,您可能会看到从以前的值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.