为了账号安全,请及时绑定邮箱和手机立即绑定

使用并行流列出设置空值

使用并行流列出设置空值

侃侃无极 2021-11-24 14:54:55
我有以下代码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]为什么某些元素显示null在 list1 中?我知道我应该使用SynchronizedListwith parallelStream,但null值让我感到惊讶。一旦您向列表中添加了一些内容,就应该设置该插槽,并且下一次执行应该为其添加另一个值。
查看完整描述

1 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

ArrayList是不是线程安全的集合,并尝试从多个线程更新它parallelStream,你看到的是结果resizing的,内部阵列ArrayList-该操作不是线程安全的要么,你先增加数组并再移动元素它:可能是元素尚未移动而您尝试访问它。


为了使它更加明确,调整大小时发生一个新的阵列与增大的尺寸创建-如果充满了这种新的阵列null小号只复制发生之后。


真的无法预测会发生什么,只是不要依赖任何这些。


编辑


我不能将此作为评论发布,但这里有一些代码证明null可以看到:


List<Integer> result = IntStream.iterate(0, i -> i + 1)

            .takeWhile(i -> {

                String arr[] = { "A", "B", "C", "D", "E", "F", "G", "H", "R", "T" };

                List<String> list = new ArrayList<>();

                Arrays.stream(arr)

                        .parallel()

                        .peek(list::add)

                        .forEach(x -> {

                        });


                if (list.contains(null)) {

                    System.out.println("It took " + i + " steps to see a null");

                    return false;

                }


                return true;

            })

            .boxed()

            .collect(Collectors.toList());


查看完整回答
反对 回复 2021-11-24
  • 1 回答
  • 0 关注
  • 156 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信