gpt4 book ai didi

java - CopyOnWriteArrayList 太慢

转载 作者:行者123 更新时间:2023-12-02 04:23:24 28 4
gpt4 key购买 nike

我有以下案例,

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

与大约花费 0.004690843ArrayList 相比,它添加元素的速度非常缓慢。我从文档中了解到原因,

A thread-safe variant of ArrayList in which all mutative operations (add, set, and so on) are implemented by making a fresh copy of the underlying array.

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

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

我认为,当您想要线程安全和速度时,Collections.synchronizedList 是更好的选择。我使用了它,大约花费了 0.007673728

我的问题:

  1. 为什么在内部创建新数组,线程安全与此有关吗?
  2. 为什么在 MAX_NUMBER = 10_00_000 的情况下花费了这么多时间? (因为 MAX_NUMBER = 10_00_00 花费了大约 6 秒)发生这种情况是因为变异操作每次都会创建新数组吗?
  3. 这是否意味着当您有大量元素且最好选择其他元素(即 Collections.synchronizedList)时,CopyOnWriteArrayList 会存在性能缺陷?
  4. 这就是我们通常在公共(public) API 中看不到 CopyOnWriteArrayList 的原因吗?除此之外还有什么缺点吗?

最佳答案

CopyOnWriteArrayList 仅当写入次数非常少且读取次数巨大时(如果多个线程正在访问此列表)才是首选选项

关于java - CopyOnWriteArrayList 太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32485979/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com