gpt4 book ai didi

java - 使用复制构造函数同时修改列表

转载 作者:搜寻专家 更新时间:2023-10-31 19:34:29 29 4
gpt4 key购买 nike

以下代码是否会导致 ConcurrentModificationException 或其他副作用?

ArrayList<String> newList = new ArrayList<String>(list);

考虑到列表的大小非常大,并且在执行上述代码时另一个线程正在并发修改列表。

最佳答案

编辑:

我最初的回答是肯定的,但正如@JohnVint 正确指出的那样,它不会是 ConcurrentModificationException 因为在幕后 ArrayList 正在使用 复制数组System.arrayCopy(...)。请参阅末尾的代码片段。

问题是在您执行此复制操作时,另一个线程正在对元素数组进行更改。您可能会得到 IndexOutOfBoundsException、未初始化的数组值,甚至是某种 native 内存访问异常,因为 System.arraycopy(...) 是在 native 代码中完成的。

您需要在更新和复制期间同步列表以防止这些竞争条件,并建立内存屏障以确保支持 ArrayList 的元素数组是适当的最新的。


public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
...
}

// ArrayList
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}

// Arrays
public static <T,U> T[] copyOf(U[] original, int newLength,
Class<? extends T[]> newType) {
...
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
}

// System
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos, int length);

关于java - 使用复制构造函数同时修改列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11034769/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com