2012-09-26 16 views
8

Ho un consumatore e un produttore che aggiunge e cancella gli oggetti Item dalla coda. Se utilizzo i metodi put() e take(). C'è qualche problema di sicurezza del thread che devo ancora coprire? Questo è simile al problema del buffer limitato e mi chiedevo solo se l'uso della coda di blocco sostituisse la necessità di semafori o monitor. L'oggetto Item stesso probabilmente avrebbe bisogno di sincronizzazione (setter ma i getter non hanno bisogno di lock), ho ragione? Infine, non sono abbastanza sicuro di come testare se è thread-safe poiché non riesco a far sì che entrambi i thread chiamino lo take() perché l'ordine di esecuzione è underterministico. Qualche idea? Grazie.Usando LinkedBlockingQueue abbastanza buono per il programma java multi-thread?

+0

Mentre l'ordine di esecuzione è non deterministico, non sarebbe la prova che LBQ non è abbastanza buono essere se alcuni elementi che si 'messo()' '' non appaiono, o lo stesso oggetto item compare ripetutamente nei risultati di '' take() ''? –

+0

Immagino che sia un test possibile ma potrebbe non essere sempre un test specifico per il thread. Forse usare thread sleep nel mezzo di chiamare take() mentre l'altro thread lo chiama anche tu? – Dan

+0

Ciò che gli Executori usano di default mi porta alla domanda; non puoi usare un ExecutorService che avvolge una coda e un pool di thread? –

risposta

7

È perfettamente thread-safe per quello che stai facendo, infatti questo è ciò per cui è stato progettato. La descrizione di BlockingQueue (che è l'interfaccia implementata da LinkedBlockingQueue) afferma:

implementazioni BlockingQueue sono thread-safe. Tutti i metodi di accodamento ottengono i loro effetti atomicamente utilizzando blocchi interni o altre forme di controllo della concorrenza.

1

put simultanea() e prendere() sono nonthread-safe quanto utilizzano 2 serrature diverse.

Questa è già una risposta qui: Are LinkedBlockingQueue's insert and remove methods thread safe?

+0

Ho seguito il collegamento e ho trovato una risposta a un altro post che spiega perché è thread-safe. http://stackoverflow.com/questions/26543807/is-blockingqueue-completely-thread-safe-in-java/26543940#26543940 – user1266174

Problemi correlati