使用带有Maps键集的流时发生ConcurrentModificationException

使用带有Maps键集的流时发生ConcurrentModificationException,第1张

使用带有Maps键集的流时发生ConcurrentModificationException

@Eran已经解释了如何更好地解决此问题。我将解释为什么

ConcurrentModificationException
会发生。

ConcurrentModificationException
发生这种情况是因为您正在修改流源。您
Map
可能是
HashMap
TreeMap
或其他非并行地图。假设它是一个
HashMap
。每个流都有的支持
Spliterator
。如果分隔符没有
IMMUTABLE
CONCURRENT
特征,那么,如文档所述:

绑定后,

ConcurrentModificationException
如果发现结构上的干扰,分离器应尽力而为。执行此 *** 作的拆分器称为 快速失败

因此,

HashMap.keySet().spliterator()
不是
IMMUTABLE
(因为
Set
可以修改)和不是
CONCURRENT
并发更新对于而言是不安全的
HashMap
)。因此,它仅检测并发更改,
ConcurrentModificationException
并按分隔符文档的规定抛出该错误。

同样值得引用的

HashMap
文档:

由此类的所有“集合视图方法”返回的迭代器都是 快速失败的
:如果在创建迭代器后的任何时间对结构进行结构修改,则除了通过迭代器自己的remove方法之外,该迭代器都将抛出

ConcurrentModificationException
。因此,面对并发修改,迭代器会快速干净地失败,而不会在未来的不确定时间内冒任意,不确定的行为的风险。

请注意,迭代器的快速失败行为无法得到保证,因为通常来说,在存在不同步的并发修改的情况下,不可能做出任何严格的保证。快速失败的迭代器会

ConcurrentModificationException
尽力而为。因此,编写依赖于此异常的程序以确保其正确性是错误的:
迭代器的快速失败行为应仅用于检测错误

尽管它只涉及迭代器,但我相信拆分器也是如此。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5488301.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存