2

假设我有一个同步HashMap,它具有一个字符串作为键,并将作为一个列表作为值。并发性: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

不,只有'Map'对于'synchronizedMap()'和'ConcurrentHashMap'都是线程安全的。 – Andreas

+1

您正在将元素添加到'list'对象,这与同步映射无关,只是恰好包含它。该列表本身必须是同步收集。 – radoh

+0

如果'Map'没有给定键的'List',你会怎么做?你不能只调用'map.put()',因为世界可能在get()调用和put()调用之间发生了变化。 – Andreas

回答

4

Collections.synchronizedMap只会为结果图提供线程安全性。如果你想在地图值是线程安全的,为什么不装饰你的列表,如:

Collections.synchronizedList(yourList) 

,然后将它们添加到地图?

+0

我在期待那个,我只是想确定它,所以我会利用CopyOnWriteArrayList – xBlackout