Предположим, у меня есть Synchronized HashMap, в котором String используется в качестве ключа, а список — в качестве значения.
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?
Map
является потокобезопасным как дляsynchronizedMap()
, так и дляConcurrentHashMap
. - person Andreas   schedule 09.12.2016list
, который не имеет ничего общего с синхронизированной картой, которая просто содержит его. Сам список должен быть синхронизированной коллекцией. - person radoh   schedule 09.12.2016Map
еще нетList
для данного ключа? Вы не можете просто позвонитьmap.put()
, потому что мир мог измениться между звонкомget()
и звонкомput()
. - person Andreas   schedule 09.12.2016