0

我正在尝试遍历 Integer ArrayList 并获取每个元素的值,但我在 int value = ... 处遇到错误。

不知道发生了什么。请指教。

Iterator<Integer> listItr = executeList.iterator(); // iterator for the execute list 
    while (listItr.hasNext()) { // iterate through list and do work!
        int robIndex = listItr.next();
        int timer = fakeRob.exeCountDown(robIndex); // decrement first then return timer
        if (timer == 0) {// check if instr finished execution
            System.out.println("timer expired. fire");
            executeList.remove(executeList.indexOf(robIndex)); // 1. remove instr from exeList
            transitState(robIndex, EX, WB); // 2. transit from EX state to WB state
            int tag = fakeRob.getTag(robIndex); // get producer tag
            regFile.setRdy(tag); // 3a. set register file ready flag for this tag
            fakeRob.wakeUp(tag); // 3b. wake up instructions with this tag
        }
    }

错误:

java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at sim.execute(sim.java:180)
at sim.<init>(sim.java:71)
at sim.main(sim.java:270

谢谢,

汉克

4

2 回答 2

1

如果局部变量值是您“做一些事情”的东西,并且您没有修改列表,那么当您在那里时,某个外部线程正在修改列表。

否则,请参阅@edalorozo 提供的链接以获取一些想法

编辑添加

我从不使用这个iterator.remove()成语,因为我从来没有对迭代器成语那么熟悉。并且总是将它与短命且实施不善的 Enumerator 东西混为一谈。在增强 for 循环之前,我通常使用非常老式的for (int i-0; i<foo.length; i++)样式进行循环。并不是所有的迭代器都支持 remove(),那么有什么意义呢?

因此,即使我现在使用增强的 for 循环,我也“习惯了”“收集所有内容并在之后删除它”的风格。在您的代码中,这将是:

ArrayList <Integer> toBeRemoved = new ArrayList <Integer>();
for (Integer robIndex : executeList) {
   // note, I distrust auto-unboxing, (see all the Java Puzzlers books!)
   // so I'd probably add an explicit unbox here
   int robIndexi = robIndex.intValue();

   int timer = fakeRob.exeCountDown(robIndexi); // decrement first then return timer
   if (timer == 0) {// check if instr finished execution
      toBeRemoved.add(robIndex);
      // all that other stuff here...
   }
}

// remove everything now
executeList.removeAll(toBeRemoved);
于 2012-05-05T23:37:05.657 回答
1

也许如果你把你正在做的事情放在循环中它会有所帮助。如果您尝试从列表中删除一个元素,您需要调用 listItr.remove() 来执行此操作。通常,您不应在循环中调用任何修改列表的函数(即 add()、set() 等...)。

以下代码将触发此

Iterator<Integer> it = executeList.iterator();
while (it.hasNext()) {
  Integer i = it.next();
  executeList.remove(i);
}

正确的方法是:

Iterator<Integer> it = executeList.iterator();
while (it.hasNext()) {
  Integer i = it.next();
  it.remove();
}

其他线程(如上所述)也可能是问题所在。请记住,迭代器由所有 java 提供的集合中的列表本身支持。因此,如果在您迭代时另一个线程修改了列表,您将遇到此问题。

于 2012-05-05T23:53:48.223 回答