并行流在任务完成之前完成

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)

  • 较小只是无效多线程`ArrayList`修改的一种可能结果.另一种可能性是结果列表中的假"null"元素.当不可变列表是可接受的结果时,`nCopies`是要走的路.如果OP确实需要一个`ArrayList`,它可以像`new ArrayList <>(Collections.nCopies(i,defaultValue))一样简单地创建`... (4认同)