我正在增强现有算法,该算法由多个独立步骤组成,以使用并发任务.每个任务都将创建多个对象来保存其结果.最后,我想列出从控制方法返回的所有结果.目前,我的代码看起来像那样
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语句时,应该没有进一步的访问权限.