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.
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
@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
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