Ich versuche, den folgenden Code auszuführen:Atomic Boolean Verwendung in Multithread-Anwendung
In meinem Konstruktor i initialisieren meine Atom boolean:
Atomic Boolean isChannelActive = new AtomicBoolean(false);
In meiner Schreibmethode ich diese boolean überprüfen und warten:
public ChannelFuture write(ByteBuf msgBuf) {
if (!isChannelActive.get()) {
try {
wait();
} catch (InterruptedException ex) {
logger.Error("Waiting interrupted", ex);
}
}
Aber das Problem ist, das Atom boolean kann zu der Zeit von anderem Thread eingestellt wird, wenn Programm eingeschaltet ist:
if (!isChannelActive.get()) {
try{ --- Right on here and program made a context switch at this time.
wait()
Also in diesem Szenario wird meine atomische Boolean wahr sein und ich vermisse das notifyAll() Ereignis und wird für immer auf den Kontextwechsel warten.
Wie kann ich dieses Problem verhindern?
Ich weiß, dass synchronisierte Blöcke die Option sein können, aber ich suche nach eleganteren Option für diesen Fall.
Wenn Sie 'wait()' nennen, sind Sie bereits ** in ** einem 'synchronisierten' Block. – Kayaman
Könnte [Bedingungen] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Condition.html) eine Alternative sein? – Fildor
Ich habe auch einen anderen Blick auf CountdownLatch Mechanismus und funktioniert auch gut. Das gleiche Problem kann mit [CountdownLatches] (https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html) erreicht werden. –