2

根据 Java 文档

检索操作(包括 get)一般不会阻塞,因此可能与更新操作(包括 put 和 remove)重叠。检索反映了最近完成的更新操作在其开始时保持的结果。对于 putAll 和 clear 等聚合操作,并发检索可能仅反映插入或删除某些条目

问题:假设线程 t1 正在更新一个键值对(称为 x),然后另一个线程 t2 来并想要读取 x,是否会在 t2 开始时创建 x 的副本 c1 并且 t2 将从中读取复制c1

4

2 回答 2

1

问题:假设线程 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 等聚合操作,并发检索可能仅反映插入或删除某些条目

于 2013-05-12T03:59:53.670 回答
1

检索反映了最近完成的更新操作在开始时保持的结果

完整的单词在这里很重要。现在你的情况是

 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 更新操作完成,它将看到更新的值,否则不会。

于 2013-05-12T03:04:11.890 回答