ConcurrentHashMap检索操作不带锁吗?

时间:2013-05-12 02:49:38

标签: java multithreading concurrenthashmap

根据Java docs

  

检索操作(包括get)一般不会阻塞,因此可能与更新重叠         操作(包括放置和删除)。检索反映了最近完成的更新操作的结果。对于诸如putAll和clear之类的聚合操作,并发检索可能反映仅插入或删除某些条目

问题:假设一个线程t1正在更新一个键值对(称为x),然后其他线程t2来了并想要读取x,那么在t2开始时会有一个由x创建的副本c1和t2将从该副本中读取c1

2 个答案:

答案 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之类的聚合操作,并发检索可能反映仅插入或删除某些条目