我试着通过编写以下代码来重现ConcurrentModificationException:
Listlast = new ArrayList<>(); last.add("a"); last.add("b"); for(String i : last){ System.out.println(i); last.remove(i); } System.out.println(last);
DEMO
既然,提到的文件ArrayList
请注意,迭代器的故障快速行为无法得到保证,因为一般来说,在存在不同步的并发修改时,不可能做出任何硬性保证.
我预计在单线程程序中,这种检测是直截了当的.但程序打印出来了
a [b]
代替.为什么?
您的代码等同于以下内容:
Listlast = new ArrayList<>(); last.add("a"); last.add("b"); for(Iterator i = last.iterator(); i.hasNext(); ) { String value = i.next(); System.out.println(value); last.remove(value); } System.out.println(last);
for
循环的流程是:
System.out.println(value); // prints "a" last.remove(value); // removes "a" from the list i.hasNext() // exits the loop, since i.hasNext() is false System.out.println(last); // prints "[b]" - the updated list
这就是为什么你得到你的输出而不是ConcurrentModificationException
.ConcurrentModificationException
如果你要在列表中添加另一个值(例如last.add("c")
),你会得到的,因为i.hasNext()
在第一次迭代之后它将是真的并且i.next()
将抛出异常.