5

Czytałem bloga, ale nie jestem pewien, czy jego wniosek jest poprawny:Czym różni się LinkedBlockingQueue od ConcurrentLinkedQueue?

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

Powiedział: Jak widać z wyników dostarczonych wyników LinkedBlockingQueue osiągnąć najlepszy połączeniu (dodawanie i usuwanie elementów) wyników wydajności i powinno być twoim kandydatem numer jeden do wdrażania schenarios producent - konsument.

Zastanawiam się, czy nie jest to szybsze, jeśli nie używam blokady w moim kodzie?

Dlaczego więc LinkedBlockingQueue jest szybszy niż kolejka bez blokady (ConcurrentLinkedQueue)?

Dzięki!

+3

Zapomnij losowych blogów? Czy za czytanie * * Javadoc nie DID słowa "ograniczone", "nieograniczone" i "blokujące" przekazują cokolwiek w ogóle? – EJP

+0

Powiązane: http://stackoverflow.com/q/1426754/931379 – Pursuit

Odpowiedz

4

ConcurrentLinkedQueue nie jest kolejką blokującą blokującą. Nie implementuje interfejsu BlockingQueue i dlatego nie zapewnia metod blokowania put() i take(). Te metody są niezbędne do konfiguracji producenta/konsumenta, ponieważ trzeba zabezpieczyć konsumenta, aby go zablokować, podczas gdy nie ma nic do konsumpcji, a producenta do zablokowania, gdy konsumenci nie zużywają wystarczająco szybko.

-1

LinkedBlockingQueue to Deque i ConcurrentBlockingQueue nie jest. Sprawdź Javadoc, aby uzyskać więcej informacji.

+1

[LinkedBlockingDeque] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/LinkedBlockingDeque.html) i [LinkedBlockingQueue] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/LinkedBlockingQueue.html) to dwie różne klasy. –

+0

Nie sądzę, LInkedBlockingQueue jest deque, i nie sądzę, ConcurrentBlockingQueue jest klasa w środowisku wykonawczym Java. –

1

Ten test porównawczy jest dziwny: używanie kolejki współbieżnej jako kolejki blokującej nie ma sensu lub czegoś brakuje. Ten kod nie jest w stanie uratować planetę ja zgadnę:

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

i jest oczywiście mniej wydajny niż:

linkedBlockingQueue.take(); 
Powiązane problemy