首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hashtable.entrySet()线程安全吗?

Hashtable.entrySet()线程安全吗?
EN

Stack Overflow用户
提问于 2015-12-04 15:37:55
回答 3查看 867关注 0票数 1

Hashtable.entrySet()返回的集合上迭代安全吗?那么Hashtable.values()Hashtable.keySet()呢?

我想要做的是:当表被不同的其他线程使用时,我想更新Hastable的条目。为此,我必须对地图中当前的所有条目进行迭代。如果在迭代期间从其他线程中添加/删除的任何条目是否被处理,这并不重要。在Hashtable上同步不是一个选项,因为更新可能需要很长时间。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-04 16:03:04

不,在并发修改的情况下,迭代Hashtable的视图是不安全的。来自javadoc (重点雷):

这个类的所有“集合视图方法”返回的集合的迭代器返回的迭代器都是失败的:如果在创建迭代器之后的任何时候对哈希表进行了结构上的修改,那么除非通过迭代器自己的remove方法,否则迭代器将抛出一个ConcurrentModificationException。因此,在并发修改的情况下,迭代器迅速而干净地失败了,而不是在未来某个未定的时间冒着任意的、不确定的行为的风险。Hashtable的键和元素方法返回的枚举不会失败。

Jabu-10245是正确的,一个ConcurrentHashMap是更合适的,并且确实满足了在并发修改发生时允许迭代的要求。

票数 2
EN

Stack Overflow用户

发布于 2015-12-04 15:42:18

来自JavaDoc

与新的集合实现不同,Hashtable是同步的。如果不需要线程安全实现,建议使用HashMap代替Hashtable。如果需要线程安全的高度并发实现,则建议使用ConcurrentHashMap代替Hashtable。

最好使用ConcurrentHashMap

票数 3
EN

Stack Overflow用户

发布于 2015-12-04 16:07:13

我想我们只是引用Hashtable的文档给您。

请注意,迭代器的快速失败行为不能保证,一般来说,在不同步并发修改的情况下不可能提供任何硬的保证。快速失败的迭代器在最大努力的基础上将ConcurrentModificationException抛出。因此,编写一个依赖于此异常的程序是错误的:迭代器的抗故障行为应该只用于检测bug。

我认为这些文档都是这样说的:当您错误地修改了一个Hashtable时,不能依赖迭代器告诉您。要么在Hashtable上同步,要么使用不同的类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34091922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档