看看下面的代码:
import
java.util.
*
;
public class FailFast ... {
public static void main(String[] args) ...{
List c = new ArrayList();
c.add("1");
c.add("2");
for(int i=0;i<c.size();i++)...{
System.out.println("c.size():"+c.size());
if(i==0)...{c.add("An object");}
System.out.println(c.get(i));
}
}
}
public class FailFast ... {
public static void main(String[] args) ...{
List c = new ArrayList();
c.add("1");
c.add("2");
for(int i=0;i<c.size();i++)...{
System.out.println("c.size():"+c.size());
if(i==0)...{c.add("An object");}
System.out.println(c.get(i));
}
}
}
当你运行这段代码的时候,你就会领略到这段代码的有趣之处了。程序是这样测试的:
1.建立一个ArrayList
2..添加两个字符串。
3.用一个循环将ArrayList中的东西打印出来,问题就在循环体内。在第一次循环的时候,我往容器中添加了一个字符串。结果在第二次循环的是时候,它就判断出,容器里字符串的个数变化了。
再看下面的一个程序
import
java.util.
*
;
public class FailFast ... {
public static void main(String[] args) ...{
List c = new ArrayList();
c.add("1");
c.add("2");
Iterator it = c.iterator();
c.add("An Object");
String s = (String)it.next();
}
}
public class FailFast ... {
public static void main(String[] args) ...{
List c = new ArrayList();
c.add("1");
c.add("2");
Iterator it = c.iterator();
c.add("An Object");
String s = (String)it.next();
}
}
这段程序代码使用了迭代器。结果回返回异常:
Exception in thread
"
main
"
java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java: 449 )
at java.util.AbstractList$Itr.next(AbstractList.java: 420 )
at FailFast.main(FailFast.java: 13 )
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java: 449 )
at java.util.AbstractList$Itr.next(AbstractList.java: 420 )
at FailFast.main(FailFast.java: 13 )
原因:
JAVA容器有一个机制(FAIL FAST),可以防止多个进程修改同一个容器的内容。如果你正在走访某个容器,另一个进程却要进行元素的安插、删除、修改等动作,便会发生问题。JAVA容器会查找“因你的进程而做的任何改变”之外的所有容器变化。如果它侦测到其他进程也在修改同一个容器,就会立刻产生一个java.util.ConcurrentModificationException。然而当你运用GET()来访问List的元素时,无法从此类监看动作中得到好处。