2013-04-13 7 views
9

Durante la lettura del codice sorgente di ArrayBlockingQueue, ho trovato un commento spiegando che utilizza "il classico algoritmo di due condizioni si trovano in qualunque libro di testo":perché Concorrenza controllo utilizza il classico algoritmo di due condizioni

/* 
* Concurrency control uses the classic two-condition algorithm 
* found in any textbook. 
*/ 

/** Main lock guarding all access */ 
private final ReentrantLock lock; 
/** Condition for waiting takes */ 
private final Condition notEmpty; 
/** Condition for waiting puts */ 
private final Condition notFull; 

Perché utilizza l'algoritmo classico a due condizioni (notEmpty, notFull)?

+10

Esso consente di svegliarsi solo discussioni interessati a tutto ciò che è appena successo. Ad esempio, un thread che tenta di "prelevare" da una coda vuota, è interessato solo alla coda che non è vuota (c'è qualcosa da fare), ma non si preoccupa che la coda non sia piena. – assylias

+0

Questa è una bella * risposta * :) –

+0

La tua domanda suggerisce che non sei d'accordo o non capisci la decisione dell'autore. Quale altro approccio sai che avrebbe potuto scegliere, invece? – seh

risposta

1

Hai già avuto un buon commento. Solo come complemento.

ArrayBlockingQueue è un stato-dipendente di classe. Ciò significa che questa classe ha operazioni che possono essere eseguite solo con alcune condizioni preliminari.

I thread dello scrittore attenderanno solo se la precondizione (notFull) è falsa.

// Se la coda è piena, lo scrittore deve attendere.
// Rilascia atomicamente il blocco e attende il segnale (notFull.signal() attivato da un lettore).
while (count == items.length)
notFull.await();

Per i lettori il concetto è identico, ma utilizzando la condizione notEmpty.

// Se la coda è vuota, il lettore deve attendere.
// Rilascia atomicamente il blocco e attende il segnale (notEmpty.signal() attivato da un autore).
while (count == 0)
notEmpty.await();

Quando un thread si sveglia allora avete bisogno di 2 cose principali:
1 - ottenere il blocco
2 - Re-Test la condizione

Problemi correlati