[英]Does ConcurrentHashMap make a copy of itself?
我最近参加了一次面试,面试官问我有关HashMap
和ConcurrentHashMap
。 在获得最初的线程安全性好处之后,我说过,与HashMap
相比,遍历它不会引发ConcurrentModificationException
。
面试官继续问我为什么不扔。 我说过, HashMap
在内部有一个变量modCount
,该变量保留对映射所做的修改次数,并且Iterator
将此数字与创建时已初始化的数字进行比较。 如果此数字不同,则将引发异常,并且ConcurrentHashMap
不会进行此比较。
然后,他说ConcurrentHashMap
会在遍历时复制其自身。
我对此声明表示怀疑,因为之前从未遇到过。 即使阅读文档也无法给我足够的答案。
它会在任何时候复制(读或写)吗?
不,它与复制任何内容无关。 在多线程环境下,不一定抛出ConcurrentModificationException
异常。
关于您的问题的几点。
ConcurrentModificationException
与并发无关(它实际上有一个不好的名字)。 当您遍历某些数据结构并在对该结构进行了一些修改之后再次使用迭代器时,将引发该错误。 这称为fail fast
行为。 由于这种行为,它可以在多线程上下文中抛出,但完全不依赖于此。
ConcurrentHashMap
是一个精细的结构,我建议您通读它。 它实现并发的方式是
访问映射中不同存储桶的所有线程自然都被分隔开,因此,除了重新哈希大小写外,无需在它们之间进行同步。
对于访问同一存储桶的线程,如果存储桶为空,则使用CAS即AtomicReference
来访问存储桶中的唯一元素。
如果正在操作的存储桶发生哈希冲突并具有多个元素,则将其保存为链接列表(JDK 1.8除外,该示例将链接列表重新构建为二叉树以在极端哈希冲突下获得更好的性能)。 链接列表的好处是,只要您以CAS方式对下一个指针进行操作,它就自然支持并发。
ConcurrentHashMap
中仍然有很多编码ConcurrentHashMap
所以我建议您仔细阅读其源代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.