当我运行以下程序时,大约需要7到8分钟才能执行。我真的不确定我在哪里弄错了,因为该程序要花很多时间才能执行。
public class Test {
public static void main(String[] args) {
final Integer[] a= new Integer[1000000];
for (int i=0; i < a.length; i++) {
a[i] = i;
}
final List<Integer> source = Arrays.asList(a);
final Set<Integer> set = new CopyOnWriteArraySet<Integer>(source);
}
}
有人可以帮我理解一下,为什么这个程序太慢了。
我的机器是具有4GB RAM的Core I7
最佳答案
我已经测试过了,确实已经向构造函数提供了1 000 000个元素的列表,这花费了很长时间(7分钟)。
这是Open JDK 2013-01-09上的参考问题:
JDK-8005953 - CopyOnWriteArraySet copy constructor is unusable for large collections
该问题将由CopyOnWriteArrayList#addAllAbsent()
构造函数调用的CopyOnWriteArraySet
方法引起。
问题摘录:
CopyOnWriteArraySet的副本构造函数太慢了
集合。仅需一台开发人员笔记本电脑就需要10多分钟
收藏中的100万个条目将被复制...
作为解决方案状态,您可以阅读:无法修复。
您可以阅读最后一条消息:
对于较大的输入,可以使addAllAbsent更快,但这会影响
小尺寸的性能。据记载
CopyOnWriteXXX类更适合于小型集合
大小。CopyOnWriteArraySet
javadoc确实指定了这一点:
最适合通常需要固定尺寸的应用
小型只读操作远远超过了变异操作,并且
您需要防止遍历期间线程之间的干扰。