LinkedList Vs ConcurrentLinkedQueue
Derzeit in einer multithreaded-Umgebung, verwenden wir eine LinkedList zu halten Daten. Manchmal in den logs bekommen wir NoSuchElementException es ist zwar der Abruf der linkedlist. Bitte Hilfe zu verstehen, die Auswirkungen auf die Leistung, wenn wir uns bewegen, aus der linkedlist zu ConcurrentLinkedQueue Umsetzung.
Dank,
Sachin
Sehr ähnlich zu stackoverflow.com/questions/4724995/... .
InformationsquelleAutor Sachin | 2011-09-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn du einen
NoSuchElementException
dann ist dies vielleicht, weil der Synchronisierung nicht richtig.Zum Beispiel: Sie sind der überprüfung mit
it.hasNext()
wenn ein element in der Liste und danach zu versuchen, um es zu Holen mitit.next()
. Dies kann fehlschlagen, wenn das element entfernt wurde in zwischen und das kann auch passieren, wenn Sie synchronisierte Versionen der Collection-API.Also dein problem nicht wirklich gelöst mit dem verschieben zu
ConcurrentLinkedQueue
. Sie kann nicht immer eine Ausnahme, aber Sie haben, um vorbereitet zu sein, dassnull
zurückgegeben, selbst wenn Sie überprüft werden, bevor es nicht leer ist. (Dies ist immer noch der gleiche Fehler, aber die Umsetzung unterscheidet sich.) Dies gilt solange, als es keine richtige Synchronisation im code mit Prüfungen für die leere und das element abrufen in der GLEICHEN synchronisierten Bereich.Gibt es eine gute chance, dass Sie den Handel
NoSuchElementException
für neueNullPointerException
danach.Dies kann nicht sein, eine direkte Antwort auf Ihre Frage über die Leistung, aber mit
NoSuchElementException
in LinkedList als Grund für den Umstieg aufConcurrentLinkedQueue
klingt ein bisschen seltsam.Bearbeiten
Einige pseudo-code für fehlerhafte Implementierungen:
Einige pseudo-code für eine korrekte Synchronisation:
Code für "gebrochen" sync (funktioniert nicht wie beabsichtigt).
Dies vielleicht das Ergebnis der direkten schalten von LinkedList zu CLQ in der Hoffnung, Sie loszuwerden, um die Synchronisierung auf Ihrem eigenen.
Einige richtige code:
oder
Das ist genau das, was ich gesagt habe. Und das ist genau das, was bewegen zu ConcurrentLinkedQueue NICHT lösen würde!
Außer wenn er mit der verlinkten Liste als queue, also nicht Durchlaufen, nur das hinzufügen/entfernen des ersten/letzten elements.
Können Sie bitte erklären Sie es ein bisschen erläutern ?
Auch er muss bereit sein, die von der Warteschlange gibt null zurück, wenn Sie überprüft werden, bevor es in seiner leere. Überprüfung auf leere und abrufen müssen, um in einer sync-Umfang. Der Vorteil von CLQ ist, dass Sie nicht bekommen eine Ausnahme, und Sie können loszuwerden, die überprüfung für leere und daher null zurückgegeben.
InformationsquelleAutor Fabian Barney
Vom Java Generics und Collections, ch. 14.2.
Beachten Sie, dass
ConcurrentLinkedQueue
implementiert nicht dieList
- Schnittstelle, so dass es genügt als Ersatz fürLinkedList
nur, wenn die letztere verwendet wurde, rein wie eine Schlange. In diesem FallConcurrentLinkedQueue
ist offensichtlich eine bessere Wahl. Es sollte kein großes performance-Problem, es sei denn, seine Größe ist Häufig abgefragt. Aber als disclaimer, man kann nur sicher sein, über die performance aus, wenn Sie Messen in Ihrem eigenen konkreten Umfeld und Programm.Das war nur downvoted versehentlich für viel weniger als eine Sekunde. Es klickt, während reshreshing
new answers
und korrigiert sofort. 🙂es war jemand anderes, weil der downvote ist immer noch da.
Ich war die downvoter, und habe nun wieder mein downvote. Zu der Zeit habe ich downvoted, die Antwort war ein Zitat-block ohne Angabe der Quelle des Zitats, noch irgendeine Unterstützung von text.
Können Sie deuten auf eine gleichzeitige datastructure die Implementierung des
List
- Schnittstelle?InformationsquelleAutor Péter Török