710 Stimmen

Warum es kein ConcurrentHashSet gegen ConcurrentHashMap gibt

HashSet basiert auf HashMap.

Wenn wir uns die HashSet<E> Umsetzung, alles wird unter der Leitung von HashMap<E,Object> .

<E> wird als Schlüssel von HashMap .

Und wir wissen, dass HashMap ist nicht thread-sicher. Deshalb haben wir ConcurrentHashMap in Java.

In Anbetracht dessen bin ich verwirrt, dass warum wir nicht über ein ConcurrentHashSet verfügen, das auf dem ConcurrentHashMap ?

Gibt es noch etwas, das ich übersehen habe? Ich muss Folgendes verwenden Set in einer Multithreading-Umgebung.

Wenn ich außerdem meine eigene Datenbank erstellen möchte ConcurrentHashSet kann ich das erreichen, indem ich einfach die HashMap a ConcurrentHashMap und den Rest so lassen, wie er ist?

759voto

Ray Toal Punkte 82654

Es gibt keinen eingebauten Typ für ConcurrentHashSet denn Sie können jederzeit ableiten. eine Menge aus einer Karte. Da es viele Arten von Karten gibt, verwenden Sie eine Methode, um eine Menge aus einer bestimmten Karte (oder Kartenklasse) zu erzeugen.

Vor Java 8 erzeugten Sie ein gleichzeitiges Hash-Set, das durch eine gleichzeitige Hash-Map unterstützt wurde, indem Sie Collections.newSetFromMap(map)

In Java 8 (wie von @Matt hervorgehoben) können Sie eine gleichzeitige Hash-Gruppe erhalten siehe über ConcurrentHashMap.newKeySet() . Dies ist etwas einfacher als das alte newSetFromMap die die Übergabe eines leeren Kartenobjekts erforderte. Aber es ist spezifisch für ConcurrentHashMap .

Wie auch immer, die Java-Designer hätten jedes Mal, wenn eine neue Kartenschnittstelle erstellt wurde, eine neue Satzschnittstelle erstellen können, aber dieses Muster wäre unmöglich durchzusetzen, wenn Dritte ihre eigenen Karten erstellen. Es ist besser, statische Methoden zu haben, die neue Sets ableiten; dieser Ansatz funktioniert immer, auch wenn Sie Ihre eigenen Map-Implementierungen erstellen.

131voto

Serge Mask Punkte 1321
Set<String> mySet = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());

103voto

kichik Punkte 30440

Mit Guave 15 können Sie auch einfach verwenden:

Set s = Sets.newConcurrentHashSet();

88voto

BullyWiiPlaza Punkte 14399

Wie Ray Toal erwähnt, ist es so einfach wie:

Set<String> myConcurrentSet = ConcurrentHashMap.newKeySet();

23voto

Mike Pone Punkte 17885

Es sieht so aus, als ob Java eine gleichzeitige Set-Implementierung mit seiner ConcurrentSkipListSet . A SkipList Satz ist nur eine besondere Art der Implementierung von Mengen. Sie implementiert immer noch die Schnittstellen Serializable, Cloneable, Iterable, Collection, NavigableSet, Set und SortedSet. Dies könnte für Sie funktionieren, wenn Sie nur die Set-Schnittstelle benötigen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X