2

Предположим, что у меня есть синхронизированная 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?

+0

Нет, только «Карта» является потокобезопасной как для «synchronizedMap()», так и для ConcurrentHashMap. – Andreas

+1

Вы добавляете элементы к объекту 'list', который не имеет ничего общего с синхронизированной картой, которая только что содержит ее. Сам список должен быть синхронизированным. – radoh

+0

Что вы будете делать, если 'Map' еще не имеет« Список »для данного ключа? Вы не можете просто называть 'map.put()', потому что мир, возможно, изменился между вызовом 'get()' и вызовом 'put()'. – Andreas

ответ

4

Collections.synchronizedMap обеспечит безопасность потоков для результирующей карты. Если вы хотите, чтобы значения карты были потокобезопасными, почему бы не украсить свои списки, например:

Collections.synchronizedList(yourList) 

а затем добавить их на карту?

+0

Я ожидал этого, я просто хотел быть уверенным в этом, поэтому я буду использовать CopyOnWriteArrayList – xBlackout