Предположим, что у меня есть синхронизированная HashMap, которая имеет строку в виде ключа и как a Список как значение.Параллелизм: HashMap и списки как значение
Map<String, List<Object>> map = Collections.synchronizedMap(new HashMap<String, List<Object>>());
Будет ли этот список быть потокобезопасным? Например, если я делаю это:
List<Object> list = map.get("whatever"); // Supposing I get a List
list.add(new Object()); // Would this be thread-safe?
В случае нет, это было бы с ConcurrentHashMap, вместо синхронизированной один? Или единственный способ избежать условий гонки - превратить его в CopyOnWriteArrayList?
Нет, только «Карта» является потокобезопасной как для «synchronizedMap()», так и для ConcurrentHashMap. – Andreas
Вы добавляете элементы к объекту 'list', который не имеет ничего общего с синхронизированной картой, которая только что содержит ее. Сам список должен быть синхронизированным. – radoh
Что вы будете делать, если 'Map' еще не имеет« Список »для данного ключа? Вы не можете просто называть 'map.put()', потому что мир, возможно, изменился между вызовом 'get()' и вызовом 'put()'. – Andreas