是否可以同时通过多个线程向Map添加元素?
就像10个线程在同一时间向Map添加元素一样,Map是否会有10个元素或1个?
更新:我不需要遍历此地图,我只需要按键添加,删除和获取元素
答案 0 :(得分:10)
有几种方法可以解决这个问题:
Hashtable
。通常不建议这样做。 Hashtable早于Java 1.2的Java Collections Framework,但它是put()
和get()
方法 synchronized
; Map
换成Collections.synchronizedMap()
(这是(1)的更好版本); ConcurrentHashMap
;或答案 1 :(得分:5)
检查ConcurrentHashMap是否适合您的情况。
答案 2 :(得分:4)
你的问题毫无意义,因为Map
是一个接口类型,而线程安全是一个实现属性。
话虽这么说,最常用的Map
实现,特别是HashMap
不线程安全。从不同线程添加元素会使地图处于不一致状态,例如,虽然size()
表明它们存在,但无法检索已插入的元素。
您可以使用Collections.synchronizedMap()
创建同步包装器,也可以使用同步的旧Hashtable
类(不推荐)。但请注意,对于单个操作,这些操作仍然只是线程安全 - 相互依赖的操作序列(如通过映射的迭代)仍然需要额外的手动同步。
ConcurrentHashMap
是一个非常有趣的实现,允许某些类型的多线程访问而不使用同步,当有许多线程并行访问它时,会产生非常好的性能。但它并不适用于所有用例。