簡體   English   中英

調用remove方法后合並迭代器集合。 主要收藏中如何反映變化?

[英]Merge the iterator collection after remove method is called. How the change is reflected in main collection?

我瀏覽了很多網頁,了解ConcurrentHashMap的工作原理以及它如何克隆實際的迭代地圖。 這樣可以獲得弱一致的屬性。

現在,在迭代時,如果我調用remove()方法,那么這個更改在哪個階段反映在主集合中?

基本上,想要了解克隆和主要集合是如何合並的?

一旦迭代完成,它就完成了嗎?

首先, ConcurrentHashMap不會使副本迭代,請參閱ConcurrentHashMap#entrySet

其次, remove的更改立即反映到集合中,請參閱ConcurrentHashMap#BaseIterator#remove

這個想法是ConcurrentHashMap使用桶,就像任何其他基於哈希的結構一樣。 當您查找( remove )一個條目時,它使用hashCode查找該條目可能首先駐留的存儲桶 ,然后立即將其刪除。

問題是,你能否發現/看到實際發生的這種刪除; 例如,您迭代並打印CHM的內容並同時刪除一些條目。 如果您已經通過forEach “訪問”某個存儲桶(並且以桶到桶的方式進行遍歷),並且該條目已從該存儲桶中刪除 - 您將無法發現它。

另一方面,如果您將從“尚未訪問”的存儲桶中刪除並輸入 - 您將發現刪除。

這就是size返回“此刻”已知大小的原因 - 例如來自bucketA的條目,然后有人刪除其中的一些條目, CHM將不會返回或同步再次計算這些條目。

還有一些非常好的評論在這里閱讀

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM