繁体   English   中英

遍历值时的HashMap线程安全

[英]HashMap threadsafety when iterating over values

有没有什么优雅的方法可以使HashMap.values()线程安全地迭代,而无需复制基础地图?

干杯。

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

2)使用线程安全的ConcurrentHashMap(无需在内部完全同步)

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

mySyncedMap = Collections.synchronizedMap(myMap);

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

另一个选择是使用ConcurrentHashMap类,如其他答案中所述。

我真的不同意R.Moeller的回答。 使用ConcurrentHashMap您不会在迭代时获得ConcurrentModificationExceptions ,但仍不认为它是线程安全的(请参见注释)。

尽管我不会复制HashMap,但我会坚持使用复制方法。 如果您有HashMap<K,V> myMap遍历new ArrayList<V>(myMap.values()) 使其更容易。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM