迭代值时的HashMap threadsafety

时间:2013-09-04 09:51:06

标签: java multithreading hashmap

是否有任何优雅的方法来迭代HashMap.values()threadsafe而不制作底层地图的副本?

欢呼声。

3 个答案:

答案 0 :(得分:3)

1)HashMap的唯一可能性是完全同步对地图的所有访问。

2)使用ConcurrentHashMap,它是线程安全的(没有在内部完全同步)

答案 1 :(得分:2)

Java中的Collections类包含使各种集合同步的方法。在您的情况下,您应该使用像这样的synchronizedMap()方法

mySyncedMap = Collections.synchronizedMap(myMap);

重要的是要注意,此方法会在地图周围放置一个包装器,但如果您保留对它的引用,则仍可访问基础地图。

另一种选择是使用其他答案中提到的ConcurrentHashMap类。

答案 2 :(得分:1)

我真的不同意R.Moeller的回答。使用ConcurrentHashMap时,迭代时不会得到ConcurrentModificationExceptions,但它仍然不被视为线程安全(请参阅注释)。

我会坚持使用复制方法,虽然我不会复制HashMap。 如果HashMap<K,V> myMap迭代超过new ArrayList<V>(myMap.values())。使其更容易。

另一种方法是使用没有迭代器的简单计数循环。

当然这两种方法都不是线程安全的,所以你应该包括额外的检查。此外,在通过values()时同时添加的元素将不可用。我不认为有一个API解决方案...你必须扩展ConcurrentHashMap,创建一个迭代器,它考虑删除和添加。但是这部分我可能错了,也许甚至不可能做到。