java:通过多个线程向地图添加值(可能吗?)

时间:2009-12-03 07:29:34

标签: java multithreading synchronization

是否可以同时通过多个线程向Map添加元素?
就像10个线程在同一时间向Map添加元素一样,Map是否会有10个元素或1个?

更新:我不需要遍历此地图,我只需要按键添加,删除和获取元素

3 个答案:

答案 0 :(得分:10)

有几种方法可以解决这个问题:

  1. 使用Hashtable。通常不建议这样做。 Hashtable早于Java 1.2的Java Collections Framework,但它是put()get()方法 synchronized;
  2. Map换成Collections.synchronizedMap()(这是(1)的更好版本);
  3. 使用ConcurrentHashMap;或
  4. 实施您自己的同步方案(不推荐)。

答案 1 :(得分:5)

检查ConcurrentHashMap是否适合您的情况。

答案 2 :(得分:4)

你的问题毫无意义,因为Map是一个接口类型,而线程安全是一个实现属性。

话虽这么说,最常用的Map实现,特别是HashMap 线程安全。从不同线程添加元素会使地图处于不一致状态,例如,虽然size()表明它们存在,但无法检索已插入的元素。

您可以使用Collections.synchronizedMap()创建同步包装器,也可以使用同步的旧Hashtable类(不推荐)。但请注意,对于单个操作,这些操作仍然只是线程安全 - 相互依赖的操作序列(如通过映射的迭代)仍然需要额外的手动同步。

ConcurrentHashMap是一个非常有趣的实现,允许某些类型的多线程访问而不使用同步,当有许多线程并行访问它时,会产生非常好的性能。但它并不适用于所有用例。