【发布时间】:2014-09-17 00:13:45
【问题描述】:
当我测试自己的答案以获取 this 问题的输出时,我得到了给定列表内容的以下输出:
// Add some strings into the list
list.add("Item 1");
list.add("Item 2");
list.add("Item 3");
list.add("Item 4");
输出:
Item 1
Item 2
Exception in thread "Thread-0" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at com.akefirad.tests.Main$1.run(Main.java:34)
at java.lang.Thread.run(Thread.java:745)
但如果使用以下列表:
// Add some strings into the list
list.add("Item 1");
list.add("Item 2");
list.add("Item 3");
输出:
Item 1
Item 2
输出中没有异常,只会打印前两项。 谁能解释它为什么会这样?谢谢
注意:代码是here。
已编辑:我的问题是为什么我没有打印第三项(意味着列表已修改)并且没有例外。
编辑了产生异常的代码,请注意列表内容:
public class Main {
public static void main(String[] args) throws InterruptedException
{
final ArrayList<String> list = new ArrayList<String>();
list.add("Item 1");
list.add("Item 2");
list.add("Item 3");
list.add("Item 4");
Thread thread = new Thread(new Runnable()
{
@Override
public void run ()
{
for (String s : list)
{
System.out.println(s);
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
});
thread.start();
Thread.sleep(2000);
list.remove(0);
}
}
【问题讨论】:
-
@TheNewIdiot:相关问题中的代码已经完成。
-
如果你可以让这个问题自成一体,那真的很有帮助。我怀疑答案很简单,就是您在不同线程之间存在竞争条件。它正在完成添加的第二个和第三个项目之间的迭代。
-
@JonSkeet 他正在谈论他发布的代码作为我想的答案。
-
@TheNewIdiot:不,我刚刚发现了帖子的最后一行,它指的是使用增强的 for 循环的代码。当 OP 尝试 add 项目时,使用
iterator.remove()将无济于事......并在不同的线程中这样做。 (这不是正常的“在循环中修改”。) -
我不明白你的谈话是关于什么的 ;) 无论如何,代码已添加。只有一个抛出异常。如果我只在列表中添加三个项目,它就不会再扔了。
标签: java iteration concurrentmodification