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 )时有性能缺陷?
  • 这是我们通常在公共API中看不到CopyOnWriteArrayList的原因吗? 除此之外是否还有其他缺点?

  • CopyOnWriteArrayList是首选选项,只有少量写入和大量读取(如果多个线程正在访问此列表)

    链接地址: http://www.djcxy.com/p/76119.html

    上一篇: CopyOnWriteArrayList is too slow

    下一篇: When is CopyOnWriteArraySet useful to achieve thread