@Eran已经解释了如何更好地解决此问题。我将解释为什么
ConcurrentModificationException会发生。
ConcurrentModificationException发生这种情况是因为您正在修改流源。您
Map可能是
HashMap或
TreeMap或其他非并行地图。假设它是一个
HashMap。每个流都有的支持
Spliterator。如果分隔符没有
IMMUTABLE和
CONCURRENT特征,那么,如文档所述:
绑定后,
ConcurrentModificationException如果发现结构上的干扰,分离器应尽力而为。执行此 *** 作的拆分器称为 快速失败
。
因此,
HashMap.keySet().spliterator()不是
IMMUTABLE(因为
Set可以修改)和不是
CONCURRENT(并发更新对于而言是不安全的
HashMap)。因此,它仅检测并发更改,
ConcurrentModificationException并按分隔符文档的规定抛出该错误。
同样值得引用的
HashMap文档:
由此类的所有“集合视图方法”返回的迭代器都是 快速失败的
:如果在创建迭代器后的任何时间对结构进行结构修改,则除了通过迭代器自己的remove方法之外,该迭代器都将抛出ConcurrentModificationException。因此,面对并发修改,迭代器会快速干净地失败,而不会在未来的不确定时间内冒任意,不确定的行为的风险。请注意,迭代器的快速失败行为无法得到保证,因为通常来说,在存在不同步的并发修改的情况下,不可能做出任何严格的保证。快速失败的迭代器会
ConcurrentModificationException尽力而为。因此,编写依赖于此异常的程序以确保其正确性是错误的:
迭代器的快速失败行为应仅用于检测错误 。
尽管它只涉及迭代器,但我相信拆分器也是如此。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)