列出并行流中的设置空值

时间:2018-10-17 18:24:47

标签: java parallel-processing java-stream

我有以下代码

final String arr[] = {"A", "B", "C", "D"};
final List<String> list1 = new ArrayList<>();
final List<String> list2 = Arrays.asList(arr).parallelStream()
                          .peek(s -> list1.add(s + s))
                          .map(s -> s + s)
                          .collect(Collectors.toList());
System.out.println(list1);
System.out.println(list2);

我得到以下结果:

[null, AA, DD, null]
[AA, BB, CC, DD]

为什么某些元素在列表1中显示null? 我知道应该将SynchronizedListparallelStream一起使用,但是null的值对我来说是令人惊讶的。 一旦将内容添加到列表中,就应该设置该广告位,并且下次执行时应该为其添加另一个值。

1 个答案:

答案 0 :(得分:6)

ArrayList不是线程安全的集合,并且您尝试使用parallelStream从多个线程更新它,您看到的是{{1}的结果} resizing的内部数组-该操作也不是线程安全的,您首先要增加数组,然后然后将元素移动到该数组:可能是元素尚未移动,然后尝试访问它。

更明确地说,当调整大小时,会创建一个尺寸增大的 new 数组-如果此新数组在充满ArrayList s后仅 复制就发生了。

这真的是不可预测的,只是不要依赖任何一个。

编辑

我无法将其发布为评论,但是下面的一些代码证明可以看到null

null