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?
risposta
È 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.
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?
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
- 1. Programma server multithread in Java
- 2. Overriding hashCode() - è abbastanza buono?
- 3. Java: ArrayBlockingQueue vs. LinkedBlockingQueue
- 4. eclipse java multithread debugging del programma
- 5. Conseguenze nel fare software "abbastanza buono"
- 6. Java: LinkedBlockingQueue tiene conto dell'ordine dei consumatori?
- 7. Perché LinkedBlockingQueue # poll() potrebbe riagganciare?
- 8. Java abbastanza stampa per la durata
- 9. Comunicazione multithread: quanto è buono l'uso di variabili atomiche come AtomicInteger? perché non c'è AtomicFloat?
- 10. LinkedBlockingQueue messo vs offerta
- 11. "Abbastanza tempo" per GWT
- 12. LinkedBlockingQueue vs ConcurrentLinkedQueue
- 13. Quanta memoria è il mio programma usando Java
- 14. perché il metodo sincronizzato non funziona per il multithread
- 15. C dove definire un mutex in un programma multithread?
- 16. Decomposizione in java, quando è abbastanza sufficiente?
- 17. DevExpress per ASP.NET abbastanza veloce
- 18. Come posso profilare la memoria del programma multithread in Python?
- 19. Quando preferire LinkedBlockingQueue su ArrayBlockingQueue?
- 20. Il multithread Socket.IO?
- 21. Risposta multithread per HttpListener
- 22. SQL Server Express è abbastanza buono per uno sviluppatore o dovrebbe ottenere la versione per gli sviluppatori?
- 23. Come posso profilare un programma multithread in Python?
- 24. Crea programma di installazione per Netbeans (JAVA)
- 25. In un programma Java multithread, ogni thread ha la propria copia di System.out?
- 26. Quando/Perché dovrei usare Multithread in Java?
- 27. Perché sto usando UpdateSourceTrigger = PropertyChanged, TwoWay non è abbastanza?
- 28. Il morbo di Mojolicious è buono per la produzione?
- 29. Non abbastanza argomenti per il formato stringa
- 30. è la latenza e il throughput in AWS SNS abbastanza buono da sostituire MQ dedicato per pub/sub?
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() ''? –
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
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? –