我使用此方法初始化具有默认值的ArrayList:
private ArrayList<Integer> createArrayList(int size, int defaultValue)
{
ArrayList<Integer> arrayList = new ArrayList<>(size);
IntStream.range(0, size ).parallel().forEach(i->{arrayList.add(defaultValue);});
return arrayList;
}
令人惊讶的是,如果我通过单元测试检查返回数组的大小,它不是固定数字,并且几乎总是小于请求的大小。
如果我删除parallel()
,则其大小始终按要求提供。
为什么会这样?
答案 0 :(得分:10)
当然它更小,你将多个线程中的多个元素添加到非线程安全的template <typename T> requires C<T>
void func(T t, T u);
(当元素无法填充原始大小时,它会重新调整大小)。
你可以用以下方法做到这一点:
ArrayList
答案 1 :(得分:0)
使用线程安全的CopyOnWriteArrayList而不是ArrayList
private ArrayList<Integer> createArrayList(int size, int defaultValue)
{
List<Integer> list = new CopyOnWriteArrayList<>(size);
IntStream.range(0, size ).parallel().forEach(i->{list.add(defaultValue);});
return list;
}