根据Java docs
检索操作(包括get)一般不会阻塞,因此可能与更新重叠 操作(包括放置和删除)。检索反映了最近完成的更新操作的结果。对于诸如putAll和clear之类的聚合操作,并发检索可能反映仅插入或删除某些条目
问题:假设一个线程t1正在更新一个键值对(称为x),然后其他线程t2来了并想要读取x,那么在t2开始时会有一个由x创建的副本c1和t2将从该副本中读取c1
答案 0 :(得分: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更新操作完成时,它将看到更新的值,否则不会。
答案 1 :(得分: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之类的聚合操作,并发检索可能反映仅插入或删除某些条目