Beim Lesen des Quellcodes von ArrayBlockingQueue
habe ich einen Kommentar gefunden, der erklärt, dass " der klassische Zwei-Bedingungen-Algorithmus in jedem Lehrbuch " verwendet wird:
Warum verwendet es den klassischen Algorithmus mit zwei Bedingungen (notEmpty, notFull)?
Sie hatten bereits einen guten Kommentar. Nur als Ergänzung.
ArrayBlockingQueue ist eine zustandsabhängige -Klasse. Dies bedeutet, dass diese Klasse Operationen hat, die nur mit einigen Vorbedingungen ausgeführt werden können.
Die Writer-Threads warten nur, wenn die Vorbedingung (notFull) falsch ist.
// Wenn die Warteschlange voll ist, muss der Writer warten.
// Gibt die Sperre ab und wartet auf das Signal (notFull.signal (), das von einem Lesegerät ausgelöst wurde).
while (count == items.length)
notFull.await ();
Für Leser ist das Konzept identisch, jedoch unter Verwendung der NotEmpty-Bedingung.
// Wenn die Warteschlange leer ist, muss der Reader warten.
// Gibt die Sperre ab und wartet auf das Signal (notEmpty.signal (), das von einem Writer ausgelöst wurde).
while (Anzahl == 0)
notEmpty.await ();
Wenn ein Thread aufwacht, brauchst du 2 Dinge:
1 - Holen Sie sich das Schloss
2 - Erneutes Testen der Bedingung
Tags und Links java concurrency