首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CopyOnWriteArrayList太慢了

CopyOnWriteArrayList太慢了
EN

Stack Overflow用户
提问于 2015-09-09 17:36:54
回答 1查看 1.7K关注 0票数 0

我有个案子,

代码语言:javascript
复制
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)));
    }

}

输出

代码语言:javascript
复制
6.861539857

ArrayList相比,它添加元素的速度相当慢,后者大约使用了0.004690843。我在文件里知道了原因,

ArrayList的一个线程安全变体,其中所有的可变操作(添加、设置等)都是通过创建基础数组的新副本来实现的。

因此,我的理解是,每当我在这个列表中添加新元素时,它将创建新的新数组,最后添加该数组的索引。我在add方法中找到了一个锁,除此之外,该方法实际上每次都会创建新的数组。

当我将MAX_NUMBER增加到10_00_000时,我的程序就会继续运行,而且永远不会结束(它会的,但我不能等这么久)。

我认为Collections.synchronizedList是更好的选择,当你想要线程安全与速度。我用了它,它用的是0.007673728

我的问题:

  1. 为什么在内部创建新的数组,线程安全与此有关?
  2. 为什么MAX_NUMBER = 10_00_000要花那么多时间呢?(使用MAX_NUMBER = 10_00_00大约花了6秒)这是因为每次变化操作都会创建新的数组吗?
  3. 这是否意味着当您有大量的元素并且更好地选择其他东西(即CopyOnWriteArrayList )时,Collections.synchronizedList会有性能缺陷吗?
  4. 这就是我们通常不会在公共API中看到CopyOnWriteArrayList的原因吗?除了这个,还有别的缺点吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-09 17:41:21

只有在写入次数非常少、读取次数非常多的情况下(如果多个线程正在访问此列表),CopyOnWriteArrayList才是首选选项。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32485979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档