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只是Iterator的包装,因此我期望ConcurrentModificationExceptionfor loop中都包含while loop。但是由于某种原因,for循环可以完美执行,并将新元素添加到集合中。那么,那里发生了什么?为什么我没有得到例外?

最佳答案

Gamma是迭代中的最后一个元素。因此,迭代器在达到Gamma后停止迭代,因此无法检测到在迭代过程中已添加元素。

在第二个循环中,由于添加了Zeta,Gamma不再是最后一个元素。因此,一旦迭代器尝试到达Zeta,它将引发异常。

关于java - ConcurrentModificationException for循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28260544/

10-11 14:30