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

时间:2015-06-16 11:11:12

标签: 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);
}

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

a
c

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

1 个答案:

答案 0 :(得分:1)

没有保证对列表的结构修改会抛出ConcurrentModificationException

来自documentation

  

请注意,无法保证快速失败的行为,因为一般来说,在存在不同步的并发修改时,无法做出任何硬性保证。快速失败的操作会尽最大努力抛出ConcurrentModificationException。因此,编写依赖于此异常的程序以确保其正确性是错误的:ConcurrentModificationException应仅用于检测错误。

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

有关详细说明,请参阅dup中的答案: