关于具有ParallelStream of List的潜在竞争条件的问题

问题描述 投票:1回答:1

我遇到了这段使用Java流的代码,特别是parallelStream(),目的是从oracle数据库中收集一些数据。请参阅下面的这种情况:

  • 范围=输入ID的某些列表
  • rangeLimit = 1000
  • rangeLimitedFunction =向数据库查询某些内容的某些函数
        ForkJoinPool threadPool = new ForkJoinPool(Math.min(Runtime.getRuntime().availableProcessors(), parallelism));

        try {
            Optional<C> res = threadPool.submit(new Callable<Optional<C>>() {
                                                    @Override
                                                    public Optional<C> call() throws Exception {
                                                        return splitByLimit(range, rangeLimit)
                                                                .parallelStream()
                                                                .map(rangeLimitedFunction::apply)
                                                                .reduce((list, items) -> {
                                                                    list.addAll(items);
                                                                    return list;
                                                                });
                                                    }
                                                }).get();

据我了解,这是如何工作的:

  1. 将范围分割为1000个块以馈入函数
  2. 处理线程中的每个块以返回一些结果
  3. 将结果汇总到POJO列表中

我的问题是试图通过简化为一个列表来施加潜在的种族条件。这些线程中有很多不可能试图将内容添加到结果列表中并可能破坏数据吗?

java stream
1个回答
0
投票

这在很大程度上取决于在这种情况下使用的List的实现。

也就是说,使用flatMap和收集器来利用Java paralell流的线程安全性并避免非线程安全列表实现的潜在陷阱,这种代码优势会更好。

就是说,paralellStreams不能为IO操作带来太多好处。它们以处理器繁重的操作为目标,通常只有在超过15000(IIRC)操作(即流迭代次数乘以cpu繁重的流操作)时才能获得回报,这种情况很少见。

© www.soinside.com 2019 - 2024. All rights reserved.