2

Angenommen, ich habe eine synchronisierte HashMap, die eine Zeichenfolge als Schlüssel und eine Liste als Wert hat.Nebenläufigkeit: HashMap und Listen als Wert

Map<String, List<Object>> map = Collections.synchronizedMap(new HashMap<String, List<Object>>()); 

Wird diese Liste threadsicher sein? wenn ich dies zum Beispiel tun:

List<Object> list = map.get("whatever"); // Supposing I get a List 
list.add(new Object()); // Would this be thread-safe? 

Falls nicht, wäre es mit einem ConcurrentHashMap sein, anstelle eines synchronisierten ein? Oder die einzige Möglichkeit, Rennbedingungen zu vermeiden, ist das Konvertieren in eine CopyOnWriteArrayList?

+0

Nein, nur die 'Map' ist Thread-sicher, sowohl für' synchronizedMap() 'als auch' ConcurrentHashMap'. – Andreas

+1

Sie fügen dem 'list'-Objekt Elemente hinzu, die nichts mit der synchronisierten Karte zu tun haben, die sie zufällig enthält. Die Liste selbst müsste eine synchronisierte Sammlung sein. – radoh

+0

Was machen Sie, wenn die 'Map' für den angegebenen Schlüssel noch keine' List' enthält? Sie können nicht einfach 'map.put()' aufrufen, da sich die Welt möglicherweise zwischen dem 'get()' - Aufruf und dem 'put()' -Aufruf geändert hat. – Andreas

Antwort

4

Collections.synchronizedMap würde nur Thread-Sicherheit für die resultierende Karte bieten. Wenn Sie die Kartenwerte threadsicher machen möchten, warum verzieren Sie Ihre Listen nicht wie folgt:

und dann zur Karte hinzufügen?

+0

Ich habe das erwartet, ich wollte nur sicher sein, also werde ich CopyOnWriteArrayList verwenden – xBlackout

Verwandte Themen