从外部同步对HashMap的访问

时间:2011-09-11 22:58:42

标签: java collections synchronization

我有一个私人HashMap,我正在使用Collections.synchronizedMap()。 API表示迭代地图时它实际上并不是“线程安全的”。我通常使用Map.entrySet()来迭代地图,所以我认为地图需要像API显示的手动同步块。但是从外面我无法在地图引用上同步,因为它是私有的......我想知道我是否应该为实际的地图引用提供一个getter(也许这不是好的OOP设计),或者返回一个深层拷贝的地图? (也许这很慢)。我不知道这种情况最好的方法是什么。有人可以提出一些想法或告诉我面对这种情况最典型的方式是什么?

1 个答案:

答案 0 :(得分:3)

如果您确实需要并发访问HashMap,我强烈建议您使用ConcurrentHashMap。这是Java 5+的util.concurrent包的一部分。它在多线程环境中比Synchronized包装器执行得更好。

如果您无法控制地图的创建方式(可能是在第三方库中),则需要在迭代时同步访问权限。有关详细信息,请参阅Collections.synchronizedMap的JavaDocs。以下是API文档中包含的示例代码。

  Map m = Collections.synchronizedMap(new HashMap());
      ...
  Set s = m.keySet();  // Needn't be in synchronized block
      ...
  synchronized (m) {  // Synchronizing on m, not s!
      Iterator i = s.iterator(); // Must be in synchronized block
      while (i.hasNext())
          foo(i.next());
  }