循环的 ConcurrentModificationException
ConcurrentModificationException for loop
ConcurrencyTest.java
Set<String> treeSet = new TreeSet<String>();
treeSet.add("Alpha");
treeSet.add("Beta");
treeSet.add("Gamma");
treeSet.add("Delta");
treeSet.add("Epsilon");
for(String str : treeSet) {
if("Gamma".equals(str)) {
treeSet.add("Zeta");
}
}
Iterator<String> it = treeSet.iterator();
while(it.hasNext()){
if("Gamma".equals(it.next())) {
treeSet.add("Lambda");
}
}
由于 Java 的集合框架是快速失败的,而 for-each 只是迭代器的包装器,我期待 ConcurrentModificationException
在 for loop
和while loop
。但是由于某种原因,for 循环执行得很好并且新元素被添加到集合中。那么,那里发生了什么?为什么我没有得到异常?
Gamma 是迭代中的最后一个元素。所以迭代器在达到 Gamma 后停止迭代,因此它无法检测到在迭代过程中添加了元素。
在第二个循环中,Gamma 不再是最后一个元素,因为已经添加了 Zeta。因此,一旦迭代器尝试到达 Zeta,它就会抛出异常。
ConcurrencyTest.java
Set<String> treeSet = new TreeSet<String>();
treeSet.add("Alpha");
treeSet.add("Beta");
treeSet.add("Gamma");
treeSet.add("Delta");
treeSet.add("Epsilon");
for(String str : treeSet) {
if("Gamma".equals(str)) {
treeSet.add("Zeta");
}
}
Iterator<String> it = treeSet.iterator();
while(it.hasNext()){
if("Gamma".equals(it.next())) {
treeSet.add("Lambda");
}
}
由于 Java 的集合框架是快速失败的,而 for-each 只是迭代器的包装器,我期待 ConcurrentModificationException
在 for loop
和while loop
。但是由于某种原因,for 循环执行得很好并且新元素被添加到集合中。那么,那里发生了什么?为什么我没有得到异常?
Gamma 是迭代中的最后一个元素。所以迭代器在达到 Gamma 后停止迭代,因此它无法检测到在迭代过程中添加了元素。
在第二个循环中,Gamma 不再是最后一个元素,因为已经添加了 Zeta。因此,一旦迭代器尝试到达 Zeta,它就会抛出异常。