-->

为什么java的ConcurrentModificationException的影响的ArrayLi

2019-10-20 07:37发布

我看到一个博客而回是说,如果你遇到麻烦concurrentmodificationexception ,转换ArrayList的到正规的[]数组,你会没事的。 它没有,虽然解释。

为什么是这样?

Answer 1:

此类的iterator和listIterator方法返回的迭代器是快速失败的:如果列表在任何时间从结构上修改创建迭代器之后,以任何方式,除了通过迭代器自身的remove或add方法,迭代器都将抛出ConcurrentModificationException

请注意,此异常并不表明对象已经由不同线程并发修改。 抛出异常,甚至一个线程被侵犯对象的合同。

在Java中,一个可以ConcurrentModificationException的尝试修改类别对象时发生(ex, java.util.List)的迭代之外。 该文件指出线程作为一个可能的原因,但你可以得到这个例外,甚至做的单线程程序。

下面的代码抛出一个ConcurrentModificationException ,尽管在单个线程执行。

List<String> mylist = new ArrayList<String>();
mylist.add("one");
Iterator<String> iterator = mylist.iterator();
while( iterator.hasNext() ) {
  iterator.next();
  mylist.remove(0);  // throws the exception
}

remove()的调用MYLIST使用迭代器处理干扰。 而迭代是使用正确的方式来删除项目java.util.Iteratorremove()方法(这是比不同java.util.List.remove(int))

如果你保持一个应用程序,看到这个异常,机会是错误是不容易发现的前面的代码块。 寻找所有的remove()调用,并确保它们都被称为一个迭代器外(如在与索引循环)或迭代器中(using iterator.remove()).

IllegalStateException

一个相关的错误是一个IllegalStateException。 如果你没有一个删除后推进迭代器可能发生这种情况()。

iterator.next();
iterator.remove();
iterator.remove();  // will throw the error

保持迭代器指针电流,在与时间上操作的一个元件next() or remove() ; 这是来自这里。



Answer 2:

当您addremove从一个元素ArrayList ,您将更改其结构。 这将违反对iterator这是这一变化之前进行初始化。

阵列,在另一方面,没有真正的迭代器。 myArray[i] = myValue仅仅是一个分配-它无助于阵列的结构,并且是原子的,像任何其他分配。



文章来源: Why does java concurrentmodificationexception affect arraylists and not standard arrays?