Я пытаюсь выполнить следующий код:Atomic Логическое использование в многопоточном приложении
В моем конструкторе я инициализировать свою атомную булево:
Atomic Boolean isChannelActive = new AtomicBoolean(false);
В моем методе записи я проверить это логическое и ждать:
public ChannelFuture write(ByteBuf msgBuf) {
if (!isChannelActive.get()) {
try {
wait();
} catch (InterruptedException ex) {
logger.Error("Waiting interrupted", ex);
}
}
Но проблема эта атомная булева может быть установлена из другого потока в то время, когда программа находится на:
if (!isChannelActive.get()) {
try{ --- Right on here and program made a context switch at this time.
wait()
Таким образом, в этом случае мое атомное булево значение будет истинным, и я пропущу событие notifyAll() и будет ждать навсегда из-за контекстного переключателя.
Как я могу предотвратить эту проблему?
Я знаю, что синхронизированные блоки могут быть вариантом, но я ищу более элегантный вариант для этого случая.
Если вы вызываете 'wait()' вы уже ** в ** блоке 'synchronized'. – Kayaman
Может ли [Условия] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Condition.html) быть альтернативой? – Fildor
Я также смотрю на механизм CountdownLatch и также отлично работает. Такую же проблему можно решить с помощью [CountdownLatches] (https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html) –