Sortiere concurrentHash Map mit threadsafty - Java, Multithreading, Sammlungen, ConcurrentShashmap

Ich verwende "concurrentHashMap" in meiner "Multithread" -Anwendung. Ich konnte es wie beschrieben sortieren Hier. aber da ich hashmap in eine Liste umwandele iIch bin besorgt wegen der Sicherheit von Thred. Meine "ConcurrentHashMap" ist eine statische Variable, daher kann ich garantieren, dass es nur eine Instanz davon geben wird. aber wenn ich es sortiere, konvertiere ich es in eine Liste, und sortiere es dann wieder in eine neue concurrentHashMap.

Ist das eine gute Übung in Multi-Threading Belebung?

Bitte lassen Sie mich Ihre Gedanken und Vorschläge wissen.

Vielen Dank im Voraus.

Antworten:

6 für die Antwort № 1

Sie sollten ein verwenden ConcurrentSkipListMap. Es ist Thread-sicher, schnell und pflegt die Bestellung entsprechend der vergleichbaren Implementierung des Objekts.


1 für die Antwort № 2

Wenn Sie es nicht viel ändern und alles, was Sie wollen, ist es sortiert zu haben, sollten Sie ein verwenden Baumkarte ** umwickelt von einem **Sammlungen.synchronizedMap () Anruf

Ihr Code wäre etwa so:

public class YourClass {
public static final Map<Something,Something> MAP = Collections.synchronizedMap( new TreeMap<Something,Something>() );
}

0 für die Antwort № 3

Meine "ConcurrentHashMap" ist daher eine statische VariableIch kann garantieren, dass es nur eine Instanz davon geben wird. aber wenn ich es sortiere, konvertiere ich es in eine Liste, und sortiere es dann wieder in eine neue concurrentHashMap.

Dies ist kein einfaches Problem.

Ich kann Ihnen sagen, dass die Verwendung einer ConcurrentHashMap diese Threads nicht sicher macht synchronizedMap Verpackung. Das Problem besteht darin, dass die Sortierung nicht als einzelne atomare Operation unterstützt wird. Es handelt sich eher um eine Sequenz von Map-API-Operationen, wahrscheinlich mit erheblichen Zeitlücken dazwischen.

Ich kann mir zwei Lösungsansätze vorstellen:

  • Vermeiden Sie das Sortieren an erster Stelle, indem Sie eine Karte verwenden, die die Schlüssel in der richtigen Reihenfolge hält; z.B. Verwenden Sie ConcurrentSkipListMap.

  • Umschließen Sie die Map-Klasse in einer benutzerdefinierten synchronisierten Wrapper-Klasse mit einer synchronisierten sort Methode. Das Problem bei diesem Ansatz besteht darin, dass Sie wahrscheinlich den durch die Verwendung von ConcurrentHashMap vermiedenen Nebenläufigkeitsengpass wieder einführen.


Und es ist erwähnenswert, dass es keinen Sinn macht, ein zu sortieren HashMap oder ein ConcurrentHashMap weil diese Karten die Reihenfolge, in der Sie die Elemente sortieren, nicht beibehalten. Du könntest einen benutzen LinkedHashMap, die den Eintragseinfügungsauftrag beibehält.


Verwandte Fragen
Speisekarte