Синхронизация методов c
, вероятно, плохая идея.Во-первых, это означает, что всякий раз, когда вы вызываете их, независимо от контекста, они будут синхронизированы, что, вероятно, не то, что вы имели в виду.Во-вторых, это не поможет атомарно разрешить условия !items.hasNext()
и c.getFinishedCount() == c.getStartedCount()
.
. Один из вариантов - инициализировать boolean
переменные внутри synchronized
блоков и затем выполнять соответствующие вызовы вне их:
final boolean isDone;
synchronized(c) {
isDone = !items.hasNext() && (c.getFinishedCount() == c.getStartedCount());
}
if (isDone) {
f.done(null, results);
return;
}
final boolean isBelowCapacity;
synchronized(c) {
isBelowCapacity = c.isBelowCapacity();
}
if (isBelowCapacity) {
RunMap(items,m,results,c,s,f);
}