为什么抛出并发修改异常?

时间:2018-06-02 19:15:16

标签: java collections

我知道在迭代时结构更改集合时会引发并发修改异常,但为什么呢?

如果我们不抛出并发修改异常会有什么潜在的问题? 并发修改异常如何防止未来的未定行为? 如果它因为防止多线程相关的问题,为什么它也会在调用迭代器的同一个线程修改集合结构时抛出它?

这可能是一个非常基本的问题,但我确实需要一些适当的方案来说服自己检查 ConcurrentmodificationException 是绝对必要的。

1 个答案:

答案 0 :(得分:2)

它不是绝对必要的",但它有助于防止单线程和多线程代码中的许多潜在错误。假设您正在迭代一个集合并添加或删除一个元素 - 迭代器应该如何处理?没有明显正确的行为(您可能希望它在迭代后期出现,或者您可能不会出现)。

为了避免使用CME,您通常需要使用两个单独的集合 - 一个是迭代的,另一个是变异的。这通常会导致代码更清晰,更容易推理。在列表的特定情况下,您可以迭代索引(for (int i = 0; i < list.size(); i++))但是在修改列表时需要注意i的更改方式,这样您就不会跳过或重复迭代在元素上。