Wann ist ein ConcurrentSkipListSet nützlich?

84

Ich habe diese Datenstruktur gerade in der Java 6-API gesehen und bin gespannt, wann sie eine nützliche Ressource sein wird. Ich lerne für die scjp-Prüfung und sehe sie nicht in Kathy Sierras Buch behandelt, obwohl ich Scheinprüfungsfragen gesehen habe, in denen sie erwähnt werden.

andandandand
quelle

Antworten:

175

ConcurrentSkipListSet und ConcurrentSkipListMap sind nützlich, wenn Sie einen sortierten Container benötigen, auf den mehrere Threads zugreifen. Dies sind im Wesentlichen die Entsprechungen von TreeMap und TreeSet für gleichzeitigen Code.

Die Implementierung für JDK 6 basiert auf dynamischen, sperrfreien Hochleistungs-Hash-Tabellen und listenbasierten Sets von Maged Michael bei IBM. Dies zeigt, dass Sie viele Operationen auf Überspringlisten atomar mithilfe von Vergleichs- und Auslagerungsoperationen (CAS) implementieren können . Diese sind sperrenfrei, sodass Sie sich synchronizedbei der Verwendung dieser Klassen keine Gedanken über den Overhead (für die meisten Vorgänge) machen müssen.

Derzeit gibt es in Java keine auf Rot-Schwarz-Bäumen basierende gleichzeitige Map / Set-Implementierung. Ich habe ein wenig in der Literatur nachgesehen und ein paar Artikel gefunden , in denen gleichzeitig RB-Bäume besser als Sprunglisten waren, aber viele dieser Tests wurden mit Transaktionsspeicher durchgeführt , der derzeit auf keiner größeren Architektur in Hardware unterstützt wird.

Ich gehe davon aus, dass die JDK-Leute hier eine Überspringliste erstellt haben, weil die Implementierung bekannt war und weil es einfach und portabel war, sie sperrfrei zu machen (mit CAS). Wenn jemand etwas klären möchte, tun Sie dies bitte. Ich bin neugierig.

Todd Gamblin
quelle
1
Dies ist auch nützlich, wenn Sie eindeutige Datensätze in einer Multithread-Umgebung auf performante Weise verfolgen möchten.
Anataliocs
4

Überspringlisten sind sortierte Listen und lassen sich effizient mit der Leistung von log (n) ändern. in dieser Hinsicht ist es wie TreeSet. Es gibt jedoch kein ConcurrentTreeSet. Was ich gehört habe ist, dass die Überspringliste sehr einfach zu implementieren ist, wahrscheinlich deshalb.

Wenn Sie einen gleichzeitigen, sortierten und effizienten Satz benötigen, können Sie ConcurrentSkipListSet verwenden

unwiderlegbar
quelle
2

Diese sind nützlich, wenn Sie einen Satz benötigen, auf den mehrere Threads gleichzeitig sicher zugreifen können. Es bietet auch eine anständige Leistung, da es schwach konsistent ist - Einfügungen können sicher vorgenommen werden, während Sie das Set durchlaufen, aber es gibt keine Garantie dafür, dass Ihr Iterator diese Einfügung sieht.

Kaleb Brasee
quelle
1

ConcurrentSkipListMap war eine fantastische Entdeckung, als ich eine Replikationsschicht für einen selbst erstellten Cache implementieren musste. Die Map-Aspekte haben den Cache implementiert, und die zugrunde liegenden List-Aspekte ermöglichen es mir, die Reihenfolge zu verfolgen, in der Objekte im Cache angezeigt wurden. Der "Überspringen" -Aspekt dieser Liste machte es effizient, ein Objekt von einer Stelle in der Liste zu entfernen und es bis zum Ende zu stoßen, wenn es im Cache ersetzt wurde.

Patrick Rusk
quelle