Java 在调用remove方法后合并迭代器集合。如何在主收藏中反映更改?

Java 在调用remove方法后合并迭代器集合。如何在主收藏中反映更改?,java,collections,Java,Collections,我浏览了很多网页,了解了ConcurrentHashMap的工作原理,以及它是如何克隆实际地图进行迭代的。这将设法获得弱一致性属性 现在,如果我调用remove()方法进行迭代,那么这个更改在主集合中反映在哪个阶段 基本上,想了解克隆和主集合是如何合并的吗 迭代完成后是否完成?首先,ConcurrentHashMap不要复制以进行迭代,请参见ConcurrentHashMap\entrySet 其次,remove的更改会立即反映到集合中,请参见ConcurrentHashMap#BaseIter

我浏览了很多网页,了解了
ConcurrentHashMap
的工作原理,以及它是如何克隆实际地图进行迭代的。这将设法获得弱一致性属性

现在,如果我调用
remove()
方法进行迭代,那么这个更改在主集合中反映在哪个阶段

基本上,想了解克隆和主集合是如何合并的吗


迭代完成后是否完成?

首先,
ConcurrentHashMap
不要复制以进行迭代,请参见
ConcurrentHashMap\entrySet


其次,
remove
的更改会立即反映到集合中,请参见
ConcurrentHashMap#BaseIterator#remove
其思想是,
ConcurrentHashMap
像任何其他基于哈希的结构一样使用bucket。当您查找(
删除
)一个条目时,它使用hashCode来查找该条目可能首先驻留的bucket,然后立即删除它

问题是,你是否能够发现/看到实际发生的移除;例如,您迭代并打印
CHM
的内容,同时删除一些条目。例如,如果您已经通过
forEach
访问了某个bucket(遍历是在bucket-to-bucket的基础上进行的),并且条目已从该bucket中删除,那么您将不会发现它

另一方面,如果您将从“尚未访问”的存储桶中删除和输入,您将看到删除

例如,这就是
size
返回“当前”已知大小的原因-它计算bucketA的示例条目,然后有人删除其中一些条目,
CHM
将不会返回或同步以再次计算这些条目

还有一些非常好的评论要读

这里的问题是,您何时看到由于删除而发生的更新