我正在增强现有的算法,该算法由多个独立步骤组成,以使用并发任务。每个任务都会创建多个对象来保存其结果。最后,我想要一个从控制方法返回的所有结果的列表。目前,我的代码看起来像这样
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;
}
}
我真的需要吗synchronized
在“## A ##”处强制与工作任务中的修改操作发生先行关系?或者我可以依赖之后发生的所有写操作invokeAll
返回并对控制线程可见?有没有什么原因,为什么我不应该从它自己的内部返回结果集合synchronized
block?
不,你不需要那个。的文档调用全部 http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/ExecutorService.html#invokeAll%28java.util.Collection,%20long,%20java.util.concurrent.TimeUnit%29规定返回时所有工作都应该完成。因此,当您到达 return 语句时,不应再进一步访问收集。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)