why Concurrency-Steuerelement verwendet den klassischen Zwei-Bedingung-Algorithmus

9

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:

%Vor%

Warum verwendet es den klassischen Algorithmus mit zwei Bedingungen (notEmpty, notFull)?

    
fuyou001 13.04.2013, 13:08
quelle

1 Antwort

1

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

    
Pedro Gandola 14.04.2013 06:22
quelle

Tags und Links