Es gibt einen Fall, in dem eine Karte erstellt wird, die nach ihrer Initialisierung nie wieder geändert wird. Es wird jedoch (nur über get(key)) von mehreren Threads aus auf sie zugegriffen werden. Ist es sicher, eine java.util.HashMap
auf diese Weise?
(Derzeit verwende ich zum Glück eine java.util.concurrent.ConcurrentHashMap
und habe keinen gemessenen Bedarf, die Leistung zu verbessern, sondern bin einfach neugierig, ob eine einfache HashMap
ausreichen würde. Daher ist diese Frage no Es geht weder um die Frage "Welches soll ich verwenden?" noch um die Leistung. Die Frage lautet vielmehr: "Wäre es sicher?")
4 Stimmen
Viele Antworten hier sind richtig in Bezug auf den gegenseitigen Ausschluss von laufenden Threads, aber falsch in Bezug auf Speicheraktualisierungen. Ich habe entsprechend hoch/runter gestimmt, aber es gibt immer noch viele falsche Antworten mit positiven Stimmen.
0 Stimmen
@Heath Borders, wenn die Instanz a statisch initialisiert wurde unmodifiable HashMap, sollte es sicher für gleichzeitiges Lesen sein (wie andere Threads nicht Updates verpasst haben könnte, da es keine Updates), richtig?
0 Stimmen
Wenn es statisch initialisiert und nie außerhalb des statischen Blocks geändert wird, dann könnte es in Ordnung sein, weil alle statischen Initialisierungen durch die Synchronisierung der
ClassLoader
. Das ist schon eine eigene Frage wert. Ich würde es trotzdem explizit synchronisieren und ein Profil erstellen, um zu überprüfen, ob es wirklich Leistungsprobleme verursacht.0 Stimmen
@HeathBorders - was meinen Sie mit "Speicheraktualisierungen"? Die JVM ist ein formales Modell, das Dinge wie Sichtbarkeit und Atomarität definiert, passiert-vor Beziehungen, verwendet aber keine Begriffe wie "Speicheraktualisierung". Sie sollten dies klären, vorzugsweise unter Verwendung der Terminologie aus dem JLS.
2 Stimmen
@Dave - Ich gehe davon aus, dass Sie nach 8 Jahren nicht immer noch auf der Suche nach einer Antwort sind, aber für das Protokoll, die Hauptverwirrung in fast allen Antworten ist, dass sie sich auf die Aktionen, die Sie auf dem Kartenobjekt durchführen . Sie haben bereits erklärt, dass Sie das Objekt nie verändern, also ist das alles irrelevant. Das einzige potenzielle "Problem" ist also wie Sie die Referenz veröffentlichen zum
Map
was Sie nicht erklärt haben. Wenn man es nicht sicher macht, ist es nicht sicher. Wenn Sie es sicher tun, es ist . Einzelheiten in meiner Antwort.