Я улучшаю существующий алгоритм, который состоит из нескольких независимых шагов для использования параллельных задач. Каждая из задач создаст несколько объектов для хранения своих результатов. В конце концов, я хотел бы иметь список всех результатов для возврата из метода управления. На данный момент мой код выглядит примерно так.
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?
