我不太清楚以下引用的最后一点:
检索操作(包括get)一般不会阻塞,所以可能 与更新操作重叠(包括put和remove)。检索 反映最近完成的更新操作的结果 坚持他们的发作。 适用于putAll和。等聚合操作 清除,并发检索可能仅反映插入或删除 一些条目。
为什么只有一些条目?
答案 0 :(得分:5)
必须一起阅读第一部分和最后部分才有意义。打破它,我们得到了:
现在,考虑在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)
putAll
和clear
不是原子操作。因此,如果一个线程调用putAll
来放置几个条目而另一个线程并行检索值,则可能会看到putAll
操作的中间状态。在putAll
方法完成之前,地图不会阻止。 (清除相同 - 当清除操作并行运行时,可以检索值。)