Java 8 为什么不在parallelStream中修改集合?

Java 8 为什么不在parallelStream中修改集合?,java-8,java-stream,Java 8,Java Stream,我读到在parallelStream中修改集合是个坏主意 我可以理解存在并发性问题,但是否有解决方法 我们可以同步还是会失去并行流的兴趣?同步集访问将确保一致的集状态,但可能会降低性能,无法解决排序问题。如果特定的操作是无序的,你可以接受它,但是这个问题没有一般的答案,也就是说,没有特定的用例。此外,它不应该修改流之外的任何内容。这就给了你必要的可能性来并行化一个流。这就是为什么我想这样做。我有一个类,它有两个hashset字段,我想根据parallelStream的数据填充它们。可能吗?我是否

我读到在parallelStream中修改集合是个坏主意

我可以理解存在并发性问题,但是否有解决方法


我们可以同步还是会失去并行流的兴趣?

同步
访问将确保一致的
状态,但可能会降低性能,无法解决排序问题。如果特定的操作是无序的,你可以接受它,但是这个问题没有一般的答案,也就是说,没有特定的用例。此外,它不应该修改流之外的任何内容。这就给了你必要的可能性来并行化一个流。这就是为什么我想这样做。我有一个类,它有两个hashset字段,我想根据parallelStream的数据填充它们。可能吗?我是否认为这是错误的?因此,主要目标是填充集合(例如,使用
forEach
),并且顺序是不相关的(即,我们不是在谈论
LinkedHashSet
)?然后,它可能会起作用(假设您正在执行线程安全访问的措施),尽管这仍然取决于环境,也取决于并行处理是否有好处。有时,首先收集到本地集合,然后在目标上执行
addAll
,可能更有效。但在一个操作中填充两个集合需要一个自定义收集器。并行流应该不会改变状态变量。这样做可能会导致严重后果。查看链接以了解原因。如果你真的需要这样做,你的设计可能是错误的。如果需要同步,则会增加额外的等待时间,因为线程不会独立运行,从而降低并行化可能为问题提供的最终性能增益。看看这个。