Ho il classico problema di un thread che spinge gli eventi sulla coda in arrivo di un secondo thread. Solo che questa volta sono molto interessato alle prestazioni. Quello che voglio ottenere è:Coda concurrent e blocking in Java
- voglio l'accesso simultaneo alla coda, spingendo il produttore, il Poping ricevitore.
- Quando la coda è vuota, voglio che il consumatore blocchi in coda, in attesa del produttore.
La mia prima idea era quella di utilizzare un LinkedBlockingQueue
, ma mi sono presto reso conto che non è concorrente e le prestazioni hanno sofferto. D'altra parte, io ora uso un ConcurrentLinkedQueue
, ma sto pagando ancora il costo di wait()
/notify()
su ogni pubblicazione. Dal momento che il consumatore, dopo aver trovato una coda vuota, non blocca, devo sincronizzarlo e wait()
su un lucchetto. Dall'altra parte, il produttore deve ottenere quel lucchetto e notify()
su ogni singola pubblicazione. Il risultato complessivo è che sto pagando il costo di sycnhronized (lock) {lock.notify()}
in ogni singola pubblicazione, anche quando non è necessario.
Ciò che immagino sia necessario qui, è una coda che è allo stesso tempo bloccante e concomitante. Immagino che l'operazione push()
funzioni come ConcurrentLinkedQueue
, con un ulteriore notify()
sull'oggetto quando l'elemento spinto è il primo della lista. Tale controllo ritengo di esistere già nello ConcurrentLinkedQueue
, poiché la spinta richiede il collegamento con l'elemento successivo. Quindi, questo sarebbe molto più veloce della sincronizzazione ogni volta sul blocco esterno.
È qualcosa di simile disponibile/ragionevole?
Perché pensi che java.util.concurrent.LinkedBlockingQueue non sia simultaneo? Penso che sia perfettamente concorrente, vedendo il suo javadoc e il codice sorgente. Ma non ho idea delle prestazioni. – Rorick
Vedere anche http://stackoverflow.com/questions/1301691/java-queue-implementations-which-one – Vadzim