【问题标题】:Is Stream.toArray() a thread safe mutable reduction?Stream.toArray() 是线程安全的可变缩减吗?
【发布时间】:2016-02-01 12:17:12
【问题描述】:

Java 8 Stream API 中的收集操作被定义为可变归约,可以安全地并行执行,即使生成的Collection 不是线程安全的。

我们可以对Stream.toArray() 方法说同样的话吗?

即使Stream 是并行流并且生成的数组不是线程安全的,此方法是否是线程安全的可变归约?

【问题讨论】:

  • 结果数组不是线程安全的 - 你是什么意思?

标签: java multithreading java-8 java-stream


【解决方案1】:

根据https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#toArray-java.util.function.IntFunction-应该是自创

...分区执行或调整大小可能需要的任何其他数组

在推论中,因为Stream.toArray() 只不过是stream.toArray(Object[]::new) 它应该也适用于Stream.toArray()

【讨论】:

    【解决方案2】:

    toArray 操作是一种可变归约,但实现方式与collect 操作不同。相反,在某些情况下它更有效。但这些是未指定的实现细节。 toArray 的文档本身并没有说明它是如何实现的,所以关于你的问题,你必须求助于更一般的陈述:

    package documentation, “Parallelism”

    …所有流操作都可以串行或并行执行。

    除了被明确识别为非确定性的操作(例如findAny())外,流是顺序执行还是并行执行不应改变计算结果。

    大多数流操作都接受描述用户指定行为的参数,这些参数通常是 lambda 表达式。为了保持正确的行为,这些行为参数必须不干扰,并且在大多数情况下必须无状态

    所以不管它是如何实现的,toArray 是一个可以并行运行的流操作,并且由于它没有被指定有任何限制或不确定的行为,它会产生与顺序模式相同(正确)的结果。这是你唯一需要考虑的事情。

    但是如果您使用重载方法toArray(IntFunction),则您有责任提供适当的功能,例如SomeType[]::new 始终是无干扰且无状态的,因此 toArray(SomeType[]::new) 的形式也是线程安全的。

    【讨论】:

      猜你喜欢
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      相关资源
      最近更新 更多