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