在Java中,如何在单线程程序中抛出ConcurrentModificationException?

Art*_*bin 6 java concurrency concurrentmodification

我正在阅读这个" Freuqent Java并发问题 "的问题,并且在谈论java.util.ConcurrentModificationException的答案时感到困惑.

我对答案的理解是,这可能发生在单线程程序中.如何或什么条件导致以下代码抛出异常?

List<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c"));
for (String string : list) { list.remove(string); }
Run Code Online (Sandbox Code Playgroud)

aio*_*obe 14

这个片段总是会抛出一个ConcurrentModificationException.

规则如下:使用迭代器迭代它时,您不能修改(添加或删除列表中的元素)(当您使用for-each循环时会发生这种情况).

但请注意,您可以通过迭代器修改列表(因为它知道修改,并且可以将其考虑在内)使用Iterator.remove或ListIterator.add.

来自文档:

此类的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出ConcurrentModificationException.

并发这里的单词指的是您在遍历期间修改列表.