看看下面的代码:
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));
}
}
} 当你运行这段代码的时候,你就会领略到这段代码的有趣之处了。程序是这样测试的:
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();
}
} 这段程序代码使用了迭代器。结果回返回异常:
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)原因:
JAVA容器有一个机制(FAIL FAST),可以防止多个进程修改同一个容器的内容。如果你正在走访某个容器,另一个进程却要进行元素的安插、删除、修改等动作,便会发生问题。JAVA容器会查找“因你的进程而做的任何改变”之外的所有容器变化。如果它侦测到其他进程也在修改同一个容器,就会立刻产生一个java.util.ConcurrentModificationException。然而当你运用GET()来访问List的元素时,无法从此类监看动作中得到好处。
本文通过两个示例代码详细介绍了Java中容器的Fail-Fast机制。当一个线程对容器进行结构上的修改时,此机制会立即抛出ConcurrentModificationException异常。文章解释了在遍历过程中修改容器内容时如何触发这一机制。

被折叠的 条评论
为什么被折叠?



