Java 为什么引发并发修改异常?

Java 为什么引发并发修改异常?,java,collections,Java,Collections,我知道,当集合在迭代过程中发生结构更改时,会引发并发修改异常,但为什么呢 如果不抛出并发修改异常,可能会出现什么问题? 并发修改异常如何防止将来的不确定行为? 如果它是因为防止多线程相关的问题,为什么在调用迭代器的同一线程修改集合结构时也会抛出它 这可能是一个非常基本的问题,但我确实需要一些适当的场景来说服自己,检查ConcurrentmodificationException是绝对必要的。这不是“绝对必要的”,但它有助于防止单线程和多线程代码中的许多潜在错误。例如,假设您正在对一个集合进行迭代

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

如果不抛出并发修改异常,可能会出现什么问题?
并发修改异常如何防止将来的不确定行为? 如果它是因为防止多线程相关的问题,为什么在调用迭代器的同一线程修改集合结构时也会抛出它


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

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


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

假设在集合末尾存储了一个5,然后,您将愉快地遍历您的集合,当您到达末尾时。。。砰,有一个4。知道发生了什么,什么时候发生(快速失败),不是很好吗?基本上,如果我们不通知发生了什么事情,你会在随机时间得到看似随机的bug,祝你好运修复这些bug。我还想知道为什么对我的问题投反对票?我认为这是一个真正需要解决的疑问。如果你认为这是重复的,请张贴问题。谢谢“让我相信检查ConcurrentmodificationException是绝对必要的。”哦,不,检查CME是绝对不必要的。用它做任何事情,而不是让它指示的编程错误显示出来,那么,隐藏编程错误。