我有以下代码
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
?
我知道应该将SynchronizedList
与parallelStream
一起使用,但是null
的值对我来说是令人惊讶的。
一旦将内容添加到列表中,就应该设置该广告位,并且下次执行时应该为其添加另一个值。
答案 0 :(得分:6)
ArrayList
不是线程安全的集合,并且您尝试使用parallelStream
从多个线程更新它,您看到的是{{1}的结果} resizing
的内部数组-该操作也不是线程安全的,您首先要增加数组,然后然后将元素移动到该数组:可能是元素尚未移动,然后尝试访问它。
更明确地说,当调整大小时,会创建一个尺寸增大的 new 数组-如果此新数组在充满ArrayList
s后仅 复制就发生了。
这真的是不可预测的,只是不要依赖任何一个。
编辑
我无法将其发布为评论,但是下面的一些代码证明可以看到null
:
null