Как упоминал Тило, лучшим способом решения вашей проблемы является наличие критической секции, содержащей флаг, который сначала проверяют потоки.Если флаг не был установлен, исправьте свою проблему и установите флаг перед выходом из критической секции.Если флаг был установлен, вы знаете, что другой поток первым пришел туда и устранил проблему, поэтому просто выйдите из критической секции.
private final ReentrantLock reentrantLock = new ReentrantLock();
private boolean fixed = false;
public void aCoolMethod(){
try {
reentrantLock.lock();
if (!fixed) {
doSomething();
}
} finally {
fixed = true;
reentrantLock.unlock();
}
doSomethingElse();
}
В качестве альтернативы, без блокировок вы можете использовать объект консенсуса, чтобы определить, какой потокработает doSomething()
:
private final AtomicBoolean turn = new AtomicBoolean(true);
private volatile boolean done = false;
public void aCoolMethod(){
if (turn.compareAndSet(true, false)) {
doSomething();
done = true;
} else {
while (!done) {
// spin or wait for condition
}
doSomethingElse();
}
}