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
将不会返回或同步以再次计算这些条目
还有一些非常好的评论要读这里的问题是,您何时看到由于删除而发生的更新