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?
不,只有'Map'對於'synchronizedMap()'和'ConcurrentHashMap'都是線程安全的。 – Andreas
您正在將元素添加到'list'對象,這與同步映射無關,只是恰好包含它。該列表本身必須是同步收集。 – radoh
如果'Map'沒有給定鍵的'List',你會怎麼做?你不能只調用'map.put()',因爲世界可能在get()調用和put()調用之間發生了變化。 – Andreas