我有个案子,
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)));
}
}输出
6.861539857与ArrayList相比,它添加元素的速度相当慢,后者大约使用了0.004690843。我在文件里知道了原因,
ArrayList的一个线程安全变体,其中所有的可变操作(添加、设置等)都是通过创建基础数组的新副本来实现的。
因此,我的理解是,每当我在这个列表中添加新元素时,它将创建新的新数组,最后添加该数组的索引。我在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的原因吗?除了这个,还有别的缺点吗?发布于 2015-09-09 17:41:21
只有在写入次数非常少、读取次数非常多的情况下(如果多个线程正在访问此列表),CopyOnWriteArrayList才是首选选项。
https://stackoverflow.com/questions/32485979
复制相似问题