并发性:作为值的 HashMap 和 Lists
Concurrency: HashMap and Lists as a value
假设我有一个同步的 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?
Collections.synchronizedMap 只会为生成的映射提供线程安全性。如果你想让地图值线程安全,为什么不像这样装饰你的列表:
Collections.synchronizedList(yourList)
然后将它们添加到地图中?
假设我有一个同步的 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?
Collections.synchronizedMap 只会为生成的映射提供线程安全性。如果你想让地图值线程安全,为什么不像这样装饰你的列表:
Collections.synchronizedList(yourList)
然后将它们添加到地图中?