代码之家  ›  专栏  ›  技术社区  ›  fastcodejava

使用并行流列出设置空值

  •  2
  • fastcodejava  · 技术社区  · 7 年前

    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 在列表1中? SynchronizedList 具有 parallelStream ,但是 无效的 一旦您向列表中添加了某些内容,就应该设置该插槽,并且下一次执行应该已经向该插槽添加了另一个值。

    1 回复  |  直到 7 年前
        1
  •  8
  •   Eugene    7 年前

    ArrayList 一个线程安全的集合,并尝试使用 parallelStream ,你看到的是 resizing 它的内部数组 阵列列表 -该操作也不是线程安全的,首先要增加数组并 然后 将元素移动到其中:可能是元素尚未移动,您尝试访问它。

    为了使其更明确,当调整大小时 创建的数组的大小增加了-如果满了 null s 只有

    编辑

    可见:

    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());