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应该抛出异常.但为什么在我的样本中这不会发生?
不能保证对列表的结构修改会抛出ConcurrentModificationException.
从文档中:
请注意,无法保证快速失败行为,因为一般来说,在存在不同步并发修改的情况下不可能做出任何硬保证。快速失败操作是
ConcurrentModificationException在尽力而为的基础上进行的。因此,编写依赖于此异常的正确性的程序是错误的:ConcurrentModificationException应该仅用于检测错误。
在这种特殊情况下,你是“幸运的”(或“不幸的”,取决于你如何看待它)。由于循环在执行另一次修改检查之前就存在,因此结构更改不会被注意到。
详细解释可以参考dup中的答案:
| 归档时间: |
|
| 查看次数: |
123 次 |
| 最近记录: |