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 synchronized
bei 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.
Ü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
quelle
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.
quelle
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.
quelle