为什么我的示例不会抛出ConcurrentModificationException

Sam*_*Sam 5 java collections concurrentmodification

我按照测试ConcurrentModificationException概念编写了这个例子:

public class Person
{
    String name;
    public Person(String name)
    {
        this.name = name;
    }
}

public static void main(String[] args)
{
    List<Person> l = new ArrayList<Person>();
    l.add(new Person("a"));
    l.add(new Person("b"));
    l.add(new Person("c"));

    int i  = 0;
    for(Person s : l)
    {
        if(s.name.equals("b"))
            l.remove(i);
        i++;
    }

    for(Person s : l)
        System.out.println(s.name);
}
Run Code Online (Sandbox Code Playgroud)

当我执行上面的main方法时,ConcurrentModificationException不会抛出,输出控制台会输出以下结果:

a
c
Run Code Online (Sandbox Code Playgroud)

根据我对这个问题的了解,当在循环列表中时,在修改列表时,ConcurrentModificationException应该抛出异常.但为什么在我的样本中这不会发生?

aio*_*obe 1

不能保证对列表的结构修改会抛出ConcurrentModificationException.

文档中:

请注意,无法保证快速失败行为,因为一般来说,在存在不同步并发修改的情况下不可能做出任何硬保证。快速失败操作是ConcurrentModificationException在尽力而为的基础上进行的。因此,编写依赖于此异常的正确性的程序是错误的:ConcurrentModificationException应该仅用于检测错误。

在这种特殊情况下,你是“幸运的”(或“不幸的”,取决于你如何看待它)。由于循环在执行另一次修改检查之前就存在,因此结构更改不会被注意到。

详细解释可以参考dup中的答案: