首页 > 解决方案 > 如何使双重汇总统计线程安全?

问题描述

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

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

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

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

标签: multithreadingjava-8streamthread-safety

解决方案


DoubleSummaryStatistics旨在用于流中,特别是在以下形式的代码中:

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

或者,当你有一个DoubleStream

DoubleSummaryStatistics stats = stream.summaryStatisitics();

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

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

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


推荐阅读