gpt4 book ai didi

java - ArrayList.Itr#next() 什么时候会在这一行抛出 ConcurrentModificationException ?

转载 作者:太空宇宙 更新时间:2023-11-04 12:18:20 26 4
gpt4 key购买 nike

这个问题是关于 JDK 1.8.0_74 的。该类是java.util.ArrayList$Itr。当调用 ArrayList#iterator() 方法时,将返回此(内部)类的实例。具体来说,我的问题是关于 Itr 上的 next() 方法:

850        public E next() {
851 checkForComodification();
852 int i = cursor;
853 if (i >= size)
854 throw new NoSuchElementException();
855 Object[] elementData = ArrayList.this.elementData;
856 if (i >= elementData.length)
857 throw new ConcurrentModificationException();
858 cursor = i + 1;
859 return (E) elementData[lastRet = i];
860 }

我了解第 851 行上的 checkForComodification 调用的基本原理 [1]。我也了解第 #853 行上的 (i >= size) 检查 [2]。

但是,第856行检查if (i >= elementData.length)要防范什么情况?

在单线程代码中,我无法使某些代码因 ConcurrentModificationException on line# 857 失败。

[1]:迭代器创建失败后结构修改:

static void coMod() {
ArrayList<Integer> list = new ArrayList<>(4);
list.add(1);
list.add(2);
Iterator<Integer> itr = list.iterator();
list.remove(0); //structural modification after iterator creation
if (itr.hasNext()) {
System.out.println("wait, there's more!");
itr.next(); // modification while iterating --
// fails at java.util.ArrayList$Itr.next(ArrayList.java:851)
}
}

[2]:迭代器到达末尾后失败

static void noHasNext() {
ArrayList<Integer> list = new ArrayList<>(4);
Iterator<Integer> itr = list.iterator();
itr.next(); // unguarded next call --
// fails at java.util.ArrayList$Itr.next(ArrayList.java:854)
}

最佳答案

这只有在多线程情况下才会发生。

我相信线程 1 必须在执行第 855 行之前立即停止。线程 2 会出现并将 ArrayList.this.elementData 设置为一个新的(较小的)数组。

这是一个廉价的检查,可以提供比否则抛出的 ArrayIndexOutOfBoundsException 异常更好的异常。理论上,优化器甚至可以检测到正在显式检查数组边界,并省略对 ArrayIndexOutOfBoundsException 的检查。

关于java - ArrayList.Itr#next() 什么时候会在这一行抛出 ConcurrentModificationException ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39130617/

26 4 0