当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
例如,某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不明确的。如果检测到这种行为,一些迭代器实现(包括 JRE 提供的所有通用 collection 实现)可能选择抛出此异常。执行该操作的迭代器称为快速失败 迭代器,因为迭代器很快就完全失败,而不会冒着在将来某个时间任意发生不确定行为的风险。
注意,此异常不会始终指出对象已经由不同线程并发修改。如果单线程发出违反对象协定的方法调用序列,则该对象可能抛出此异常。例如,如果线程使用快速失败迭代器在 collection 上迭代时直接修改该 collection,则迭代器将抛出此异常。所以出现这种异常的通畅情况是使用了Iterator的原因,比如list。
List<String> mm= new ArrayList<String>();
mm.add("1");mm.add("34");
for(String m : mm){
System.out.println(m);
}
如果同时有其它线程对mm进行了修改,则抛出上面的异常。
如果要避免这种错误,那么就不要使用Iterator,写成:
for(int i = 0; i< mm.size();++i){
println(mm.get(i));
}