2012-03-29 9 views
4

Ich verwende 'concurrentHashMap' in meiner 'Multithread' Anwendung. Ich konnte es sortieren wie beschrieben here. aber da ich hashmap zu einer Liste umwandele, bin ich etwas besorgt über die Sicherheit von Thred. Meine 'ConcurrentHashMap' ist eine statische Variable, daher kann ich garantieren, dass es nur eine Instanz davon gibt. aber wenn ich es sortiere, konvertiere ich es in eine Liste, und sortiere es dann wieder in eine neue concurrentHashMap.Sortiere concurrentHash Map mit threadsafty

Ist dies eine gute Übung in der Belebung von Multi-Threading?

Bitte lassen Sie mich Ihre Gedanken und Anregungen wissen.

Vielen Dank im Voraus.

+1

Nebenläufigkeit beiseite, es gibt keine sortierte HashMap. Sie können die Werte in eine Liste kopieren und die Liste sortieren. Wenn Sie die Listenwerte jedoch wieder in die HashMap übernehmen, werden sie in die Hash-Reihenfolge zurückversetzt. (Es gibt LinkedHashMap, aber es gibt keine gleichzeitige Version davon.) – Wyzard

+0

@Wyzard - also, wenn ich es nach meinem Komparator sortiert und erstellen Sie eine neue concurrentHashMap und setzen Sie es in eine Schleife aus der Liste sollte es in einer sortierten Weise sein, oder? – Sam

+1

Wenn Sie die Elemente aus der sortierten Liste in eine neue ConcurrentHashMap einfügen und dann über diese Map iterieren, finden Sie die Elemente in der gleichen Reihenfolge wie in der ursprünglichen ConcurrentHashMap, * nicht * in der sortierten Liste . – Wyzard

Antwort

1

Wenn Sie es nicht viel ändern und alles, was Sie wollen, ist es zu haben, sortiert, sollten Sie eine TreeMap ** durch einen ** Collections.synchronizedMap() Anruf gewickelt verwenden

Ihr Code würde so etwas wie dieses :

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

Danke für die Beantwortung. Ich habe diese Art von Karte nie benutzt. Ich werde nach einigen Beispielen suchen und sehen .. wenn Sie einige Beispiele haben, lassen Sie mich bitte wissen.will jetzt durch die TreeMap API gehen. Danke. – Sam

6

Sie sollten eine ConcurrentSkipListMap verwenden. Es ist threadsicher, schnell und pflegt die Bestellung entsprechend der vergleichbaren Implementierung des Objekts.

+0

Danke für die Wende. Gibt es ein Beispiel, das ich über ConcurrentSkipListMap bekommen kann? Ich habe es nie benutzt. Wenn Sie etwas haben, lassen Sie es mich wissen. Ich werde anfangen, daran zu arbeiten. – Sam

+0

@Sam Sie sollten sich die Vergleichbare Schnittstelle ansehen. Wenn jeder Schlüssel der Karte vom Typ Vergleichbar ist, wird jede Karte automatisch die Karte selbst bestimmen. Es hat ähnliche Funktionalität und zeitliche Komplexität einer TreeMap. –

0

Meine 'ConcurrentHashMap' ist eine statische Variable, daher kann ich garantieren, dass es nur eine Instanz davon gibt. 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 für eine Tatsache sagen, dass die Verwendung einer ConcurrentHashMap dies nicht Thread-sicher machen wird. Es wird auch keinen synchronizedMap Wrapper verwenden. 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.

kann ich zwei Ansätze denken, dies zu lösen:

  • vermeiden die Notwendigkeit an erster Stelle die Sortierung nach einer Karte verwenden, die Schlüssel, um 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, ein HashMap oder ein ConcurrentHashMap zu sortieren macht, weil diese Karten nicht den Auftrag erhalten, in denen Sie die Elemente sortieren. Sie könnten eine LinkedHashMap verwenden, die die Reihenfolge der Eingabeeinträge beibehält.

+0

Danke Stephan. aber was passiert, wenn ich den Code innerhalb des Blocks 'Synchronisiert' verwende? Der Grund ist, ich muss sicherstellen, dass die Concurrenthashmap nur sortierte Liste mit dem Thread safty.thinking von Sortierwerten vor dem Einfügen in die hashmap enthält. – Sam

+0

@Sam - das Sortieren innerhalb eines synchronisierten Blocks hilft nur, wenn jede andere Verwendung der Map auch auf demselben Objekt synchronisiert wird. Und das wird wahrscheinlich zu einem Nebenläufigkeitsengpass führen ... –