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?
Nein, nur die 'Map' ist Thread-sicher, sowohl für' synchronizedMap() 'als auch' ConcurrentHashMap'. – Andreas
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
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