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

Java 8中并行流的变异简化

  •  6
  • Hearen  · 技术社区  · 7 年前

    约书亚·布洛克 在里面 <Effective Java> (Third Edition) 提到

    由streams collect方法执行的操作,称为 可变约化 ,不适合并行,因为组合集合的开销很高。

    我看了文件 Mutable reduction ,但我还是不太确定 为什么? 归约不是并行性的好选择。是不是 synchronization ?

    正如@ravindra ranwala指出的(我也在 Reduction, concurrency, and ordering 文档):

    并行执行该操作实际上可能会适得其反。这是因为 结合 步骤(通过键将一个映射合并到另一个映射)可以是 昂贵的 对于一些映射实现。

    如果是的话,还有其他的吗 主要因素 我们需要关心这是否会导致低性能?

    1 回复  |  直到 7 年前
        1
  •  5
  •   Ravindra Ranwala    7 年前

    不,它是 没有什么 与…有关 synchronization . 你有一百万 Person 对象,需要找出所有 people 住在纽约的人。一条典型的河流管道是,

    people.parallelStream()
        .filter(p -> p.getState().equals("NY"))
        .collect(Collectors.toList());
    

    考虑并行执行此查询。假设我们有10个线程并行执行它。每个线程都会将自己的数据集累积到一个单独的本地容器中。最后将10个结果容器合并成一个大容器。这个 合并 会很昂贵而且是 额外的 由并行执行引入的步骤。因此并行执行可能并不总是更快。有时顺序执行可能比并行计数器部分更快。

    所以总是从顺序执行开始。如果这只是有意义的话,你可能会在以后的某个时间点回到它的平行对应。