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