yon*_*oni 1 java parallel-processing thread-safety java-stream
我使用此方法初始化具有默认值的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;
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,如果我通过单元测试检查返回数组的大小,它不是固定数字,并且几乎总是小于请求的大小.
如果我删除parallel()它的大小总是按要求.
为什么会这样?
Eug*_*ene 10
当然它更小,你是从多个线程添加多个元素到非线程安全ArrayList(当元素无法填充它的原始大小时,它会重新调整大小).
你可以用以下方法做到这一点:
Collections.nCopies(i, defaultValue);
Run Code Online (Sandbox Code Playgroud)