CopyOnWriteArrayList太慢
我有以下情况,
public class Test {
private static final int MAX_NUMBER = 10_00_00;
public static void main(String[] args) {
List<Integer> list = new CopyOnWriteArrayList<>();
long start = System.nanoTime();
for(int i = 0; i < MAX_NUMBER; i++) {
list.add(i * 2);
}
long end = System.nanoTime();
System.out.println(((end - start) / Math.pow(10, 9)));
}
}
OUTPUT
6.861539857
与ArrayList
相比,它添加的元素相当慢,大约需要0.004690843
。 我开始知道文档中的原因,
ArrayList
线程安全变体,其中所有可变操作(add,set等)都通过创建底层数组的新副本来实现。
所以,我的理解是,每当我在这个列表中添加新元素时,它将创建新的新鲜数组并在该数组的最后一个索引处添加元素。 我在add
方法中找到了一个锁,除此之外,每次都会创建新的数组。
当我将MAX_NUMBER
增加到10_00_000
我的程序继续运行并永不结束(它会但我不能等待那么久)。
我认为Collections.synchronizedList
是一个更好的选择,因为您希望线程安全快速。 我用它,它花了大约0.007673728
。
我的问题:
MAX_NUMBER = 10_00_000
情况下需要花费很多时间? (因为MAX_NUMBER = 10_00_00
需要大约6秒钟)是否发生这种情况,因为每次变化操作都会创建新数组? CopyOnWriteArrayList
在有大量元素并且更好地选择其他元素(比如Collections.synchronizedList
)时有性能缺陷? CopyOnWriteArrayList
的原因吗? 除此之外是否还有其他缺点? CopyOnWriteArrayList
是首选选项,只有少量写入和大量读取(如果多个线程正在访问此列表)