5

ho letto il blog, ma non sono sicuro se la sua conclusione è corretta:Qual è la differenza tra LinkedBlockingQueue e ConcurrentLinkedQueue?

http://www.javacodegeeks.com/2010/09/java-best-practices-queue-battle-and.html#ixzz1seaiSLwp

Disse: Come si può vedere dalla performance ha fornito risultati LinkedBlockingQueue ha ottenuto il miglior combinato (aggiunta e la rimozione di elementi) risultati delle prestazioni e dovrebbe essere il vostro candidato numero uno per l'attuazione di schenari produttore-consumatore.

Mi chiedo, non è più veloce se non uso il blocco nel mio codice?

Quindi perché LinkedBlockingQueue è più veloce della coda bloccata (ConcurrentLinkedQueue)?

Grazie!

+3

Dimenticate blog casuali:? Avete considerato la lettura del * * Javadoc non l'ha fatto le parole 'bounded', 'illimitato' e 'blocking' trasmettono qualcosa? – EJP

+0

Correlati: http://stackoverflow.com/q/1426754/931379 – Pursuit

risposta

4

ConcurrentLinkedQueue non è un che blocca la coda. Non implementa l'interfaccia BlockingQueue e quindi non fornisce i metodi di blocco put() e take(). Questi metodi sono necessari per un setup produttore/consumatore, perché è necessario predisporre il blocco del consumatore mentre non c'è nulla da consumare e il produttore deve bloccarsi quando i consumatori non consumano abbastanza velocemente.

-1

LinkedBlockingQueue è un Deque e ConcurrentBlockingQueue no. Controllare Javadoc per ulteriori dettagli

+1

[LinkedBlockingDeque] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/LinkedBlockingDeque.html) e [LinkedBlockingQueue] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/LinkedBlockingQueue.html) sono due classi diverse. –

+0

Non penso che LInkedBlockingQueue sia un deque e non penso che ConcurrentBlockingQueue sia una classe nel runtime Java. –

1

Questo benchmark è strano: l'uso della coda simultanea come coda di blocco non ha senso o mi manca qualcosa. Questo codice non è andare a salvare il pianeta immagino:

while(result == null) 
    result = concurrentLinkedQueue.poll(); 

ed è ovviamente meno efficiente rispetto:

linkedBlockingQueue.take();