关于ConcurrentHashMap javadoc的说明

时间:2013-07-15 13:20:31

标签: java map concurrency

我不太清楚以下引用的最后一点:

  

检索操作(包括get)一般不会阻塞,所以可能   与更新操作重叠(包括put和remove)。检索   反映最近完成的更新操作的结果   坚持他们的发作。 适用于putAll和。等聚合操作   清除,并发检索可能仅反映插入或删除   一些条目。

为什么只有一些条目?

3 个答案:

答案 0 :(得分:5)

必须一起阅读第一部分和最后部分才有意义。打破它,我们得到了:

  • 检索操作(包括get)通常不会阻塞,因此它们可能与更新操作重叠
  • 检索反映了最近完成的更新操作在发生时的结果

现在,考虑在putAll(这是ConcurrentHashMap.java源)的情况下会发生什么:

for (Map.Entry<? extends K, ? extends V> e : m.entrySet())
    put(e.getKey(), e.getValue());

请注意,它会在循环中将每个条目添加到地图中。如果您通过100个条目调用putAll,并且有50%的时间通过,则另一个帖子会尝试get来自地图的值,只有50个条目可用putAll那个时候。

具体来说:在您致电{{1}之前,文档未通知您特定的条目将无法使用,只是整个集合操作可能不完整在另一个线程中,因为它们彼此不同步。

答案 1 :(得分:0)

可能只会看到“部分”更改,因为另一个主题可能会在 putAll()clear()期间访问地图,这两个步骤都需要很多步骤才能完成它只是部分完成。

答案 2 :(得分:0)

putAllclear不是原子操作。因此,如果一个线程调用putAll来放置几个条目而另一个线程并行检索值,则可能会看到putAll操作的中间状态。在putAll方法完成之前,地图不会阻止。 (清除相同 - 当清除操作并行运行时,可以检索值。)