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

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

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 ##”处同步以强制执行与工作任务中的修改操作之前发生的关系?或者,在invokeAll返回并且对控制线程可见之后,我可以依赖所有写操作吗?有什么理由,为什么我不应该从自己的synchronized块中返回结果集合?

解决方法:

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

上一篇:PHP / MySQL概念数据库’同步’问题


下一篇:c# – 在每天同步的不同机器上有两个SQL Server数据库的好方法吗?