当前位置:  开发笔记 > 编程语言 > 正文

了解concurrentModificationException和ArrayList的实现

如何解决《了解concurrentModificationException和ArrayList的实现》经验,为你挑选了1个好方法。

我试着通过编写以下代码来重现ConcurrentModificationException:

List last = 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]

代替.为什么?



1> Grisha Weint..:

您的代码等同于以下内容:

   List last = 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()将抛出异常.


是的,问题的关键是i.hasNext()是假的,因此检查共同修改永远不会发生,并且永远不会抛出异常.它是错误的原因是因为就迭代器而言,它已经跨过一个大小为1的列表,所以它完成了
推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有