java - 我是否需要同步 invokeAll 调用的结果?

标签 java concurrency synchronization

我正在增强现有算法,该算法由多个独立步骤组成以使用并发任务。每个任务都将创建多个对象来保存其结果。最后,我想要一个从控制方法返回的所有结果的列表。目前,我的代码看起来像这样

private final ExecutorService pool = ...;

// A single task to be performed concurrently with other tasks.
private class WorkHorse implements Callable<Void> {
    private final Collection<X> collect;

    public WorkHorse(Collection<X> collect, ...) {
        this.collect = collect;
    }

    public Void call() {
        for (...) {
            // do work

            synchronized (this.collect) {
                this.collect.add(result);
            }
        }
        return null;
    }
}

// Uses multiple concurrent tasks to compute its result list.
public Collection<X> getResults() {
    // this list is supposed to hold the results
    final Collection<X> collect = new LinkedList<X>();

    final List<WorkHorse> tasks = Arrays.asList(  
        new WorkHorse(collect, ...), new WorkHorse(collect, ...), ...);
    this.pool.invokeAll(tasks);

    // ## A ##
    synchronized (collect) {
        return collect;
    }
}

我真的需要“## A ##”处的 synchronized 来强制与工作任务中的修改操作发生先行关系吗?或者我可以依赖所有写操作在 invokeAll 返回后发生并且对控制线程可见吗?有什么理由,为什么我不应该从它自己的 synchronized block 中返回结果集合?

最佳答案

不,你不需要那个。 invokeAll 的文档声明所有工作都应该在它返回时完成。因此,当您到达返回语句时,应该没有进一步的访问权限。

关于java - 我是否需要同步 invokeAll 调用的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1360936/

相关文章:

java - 如何在 JTextfied 中只接受 0 到 8 之间的数值?

java - Maven 程序集插件从特定依赖项中排除文件

java - 检测 IntelliJ 2019 内部使用的 Java 运行时版本?

java - 为什么我在线程 "AWT-EventQueue-0"java.lang.ArrayIndexOutOfBoundsException : 2? 中收到异常

javascript - 使用 JavaScript Web Workers 的并行编程/同步

c++ - 如何在main之前预加载数据

java - 为什么我的 EditText TextWatcher 从模拟器键盘给我空错误?

go - slice 的长度在已经使用 WaitGroup 时有所不同

Java数组元素和内存可见性问题

database - 当生产中有 "sales"更新时,如何保持测试和生产电子商务数据库同步?