我有以下案例,
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
相比,它将慢慢地添加 <{1}}。我在文档中了解了原因,
0.004690843
的线程安全变体,其中包含所有可变操作 (添加,设置等)是通过制作新的副本来实现的 底层数组。
所以,我的理解是,每当我在这个列表中添加新元素时,它将创建新的新数组并在该数组的最后一个索引处添加元素。我在ArrayList
方法中找到了一个锁,除此之外,该方法实际上每次都在创建新数组。
当我将add
增加到MAX_NUMBER
时,我的程序会一直运行并且永远不会结束(它会,但我不能等待这么久)。
我认为10_00_000
是您希望线程安全加速的更好选择。我使用了它,大概花了Collections.synchronizedList
。
我的问题:
0.007673728
会花费这么多时间? (由于MAX_NUMBER = 10_00_000
花了大约6秒钟)这是否发生了,因为变异操作每次都会创建新数组? MAX_NUMBER = 10_00_00
)时,这是否意味着CopyOnWriteArrayList
存在性能缺陷?Collections.synchronizedList
的原因吗?除此之外还有其他缺点吗?答案 0 :(得分:2)
CopyOnWriteArrayList
是首选选项,只有少量写入和大量读取(如果多个线程正在访问此列表)