看看下面的代碼:
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中的東西打印出來,問題就在循環體內。在第一次循環的時候,我往容器中添加了一個字符串。結果在第二次循環的是時候,它就判斷出,容器裏字符串的個數變化了。
再看下面的一個程序
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();
}
}
這段程序代碼使用了迭代器。結果回返回異常:
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的元素時,無法從此類監看動作中得到好處。