根据 Java 文档
检索操作(包括 get)一般不会阻塞,因此可能与更新操作(包括 put 和 remove)重叠。检索反映了最近完成的更新操作在其开始时保持的结果。对于 putAll 和 clear 等聚合操作,并发检索可能仅反映插入或删除某些条目
问题:假设线程 t1 正在更新一个键值对(称为 x),然后另一个线程 t2 来并想要读取 x,是否会在 t2 开始时创建 x 的副本 c1 并且 t2 将从中读取复制c1
根据 Java 文档
检索操作(包括 get)一般不会阻塞,因此可能与更新操作(包括 put 和 remove)重叠。检索反映了最近完成的更新操作在其开始时保持的结果。对于 putAll 和 clear 等聚合操作,并发检索可能仅反映插入或删除某些条目
问题:假设线程 t1 正在更新一个键值对(称为 x),然后另一个线程 t2 来并想要读取 x,是否会在 t2 开始时创建 x 的副本 c1 并且 t2 将从中读取复制c1
问题:假设线程 t1 正在更新一个键值对(称为 x),然后另一个线程 t2 来并想要读取 x,是否会在 t2 开始时创建 x 的副本 c1 并且 t2 将从中读取复制c1
这取决于。如果 T1 的操作完成,T2 将看到该值。否则,T2 将看到旧值。
来自http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ConcurrentHashMap.html:
检索反映了最近完成的更新操作在其开始时保持的结果。对于 putAll 和 clear 等聚合操作,并发检索可能仅反映插入或删除某些条目
检索反映了最近完成的更新操作在开始时保持的结果
完整的单词在这里很重要。现在你的情况是
Suppose a thread t1 is updating a key-value pair(called x), and then other thread t2 comes and want to read x.
T2 将读取已完成且不在进程中的操作更新的值。在您的场景中,如果线程 t1 的更新操作未完成,则 t2 将看不到更新的值。不创建副本。其简单的时间基础。如果到 t2 线程读取 x 值并且 t2 更新操作完成,它将看到更新的值,否则不会。