multithreading - 如何使双重汇总统计线程安全?
问题描述
DoubleSummaryStatistics summaryStats = mTransactionSet.stream() .mapToDouble(this::getPrice).summaryStatistics();
我有上面的代码,但 javadoc 说 DoubleSummaryStatistics 不是线程安全的。
那么如何确保多个线程在对 mTransactionSet 进行操作时能够正常工作呢?
任何指针将不胜感激。谢谢
解决方案
DoubleSummaryStatistics
旨在用于流中,特别是在以下形式的代码中:
DoubleSummaryStatistics stats = stream.collect(Collectors.summarizingDouble());
或者,当你有一个DoubleStream
:
DoubleSummaryStatistics stats = stream.summaryStatisitics();
这适用于顺序流和并行流。并行流不会使用单个DoubleSummaryStatistics
对象来收集数据,它将在每个线程中使用不同的实例,然后将数据与DoubleSummaryStatistics::combine
.
如果你想DoubleSummaryStatistics
在流中使用,你不必考虑所有这些东西。Java 为您完成。如果您想在多线程环境中自己使用它,请使用与并行流相同的方法:每个线程应该使用自己的DoubleSummaryStatistics
对象,最后将所有数据组合在一起。
或者您当然会同步对对象的所有访问,但这可能会非常慢。
推荐阅读
- python - Wagtail API - 如何公开片段
- python - 通过 Halley 方法使用 tensorflow 求 4 次多项式的根
- microsoft-teams - Microsoft Teams 需要什么条件才能创建传出 Webhook?
- python - django 默认日期格式为 %d-%m-%Y
- jira - 如何获取最近两周打开的已完成项目的状态
- java - 如何运行使用测试资源而不是主要资源的 Java 应用程序?
- apache-tika - Tika:检测到错误的 mime 类型
- batch-file - 使用批处理脚本更新键的值
- function - 如何转换函数类型?
- mysql - 无法使用 Rails 5.0.1 和 MySQL 更新布尔列