如何使双摘要统计线程安全?

时间:2018-07-14 07:26:28

标签: multithreading java-8 stream thread-safety

DoubleSummaryStatistics summaryStats = mTransactionSet.stream()                     .mapToDouble(this :: getPrice).summaryStatistics();

我有上面的代码,但是javadoc说DoubleSummaryStatistics不是线程安全的。

那么我如何确保对mTransactionSet进行操作时多个线程能够正常工作?

任何指针将不胜感激。谢谢

1 个答案:

答案 0 :(得分:2)

DoubleSummaryStatistics旨在用于流中,尤其是形式为以下代码的

DoubleSummaryStatistics stats = stream.collect(Collectors.summarizingDouble());

或者,如果您有DoubleStream

DoubleSummaryStatistics stats = stream.summaryStatisitics();

这适用于顺序流和并行流。并行流将不使用单个DoubleSummaryStatistics对象来收集数据,而是将在每个线程中使用不同的实例,然后将数据与DoubleSummaryStatistics::combine合并。

如果您想在流中使用DoubleSummaryStatistics,则不必考虑所有这些东西。 Java为您做到了。如果要在多线程环境中自己使用它,请使用与并行流相同的方法:每个线程应使用自己的DoubleSummaryStatistics对象,最后将所有数据组合在一起。

或者您当然可以同步对对象的所有访问,但这可能会非常慢。