是否有任何优雅的方法来迭代HashMap.values()threadsafe而不制作底层地图的副本?
欢呼声。
答案 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
,创建一个迭代器,它考虑删除和添加。但是这部分我可能错了,也许甚至不可能做到。