Java中的ConcurrentHashMap和Hashtable [重复]
Posted
技术标签:
【中文标题】Java中的ConcurrentHashMap和Hashtable [重复]【英文标题】:ConcurrentHashMap and Hashtable in Java [duplicate] 【发布时间】:2012-09-20 17:11:08 【问题描述】:Java 中 ConcurrentHashMap 和 Hashtable 有什么区别?
哪个对线程应用程序更有效?
【问题讨论】:
对于非线程应用程序,使用HashMap
。
始终建议使用 concurrenthashmap 而不是 hashtable。请在上面找到文章ibm.com/developerworks/java/library/j-jtp07233/index.html
更多信息请参见***.com/a/40878/632951。
@Keith Randall,java 中没有非线程应用程序。它要么是多线程的,要么是单线程的(只有主线程)。您说的是单线程应用程序。
【参考方案1】:
ConcurrentHashMap 和 Hashtable 锁定机制
Hashtable
属于 Collection 框架; ConcurrentHashMap
属于 Executor 框架。
Hashtable
对整个数据使用单锁。 ConcurrentHashMap
在段级别(默认为 16)而不是对象级别(即整个 Map
)使用 多重锁。
ConcurrentHashMap
锁定仅适用于更新。在检索的情况下,它允许完全并发,检索反映最近完成的更新操作的结果。因此,在使用锁完成写入时,读取可能会非常快。
ConcurrentHashMap
不会抛出 ConcurrentModificationException
如果一个线程尝试修改它,而另一个线程正在迭代它并且不允许空值。
ConcurrentHashMap
返回 Iterator
,它在并发修改时是故障安全的(即迭代器将复制内部数据结构)。
ConcurrentHashMap
使用数据库分片逻辑(Segment<K, V>[] segments
)称为并发级别,即将数据划分为分片(段),然后在每个分片(段)上加锁,而不是单独放置一个锁定整个数据 (Map
)。默认值为 16。
要从技术上更深入地了解 ConcurrentHashMap,请查看link
以下类比仅帮助您理解概念(而非逻辑)
假设Hashtable
和 ConcurrentHashMap
是两种类型的 Home。
Hashtable
锁住家的大门。
ConcurrentHashMap
锁定特定房间的门而不是主门。
哪个对线程应用程序更有效?
ConcurrentHashMap
对于线程应用程序更有效。
【讨论】:
家庭示例战胜了所有理论:) 这是否意味着 ConcurrentHashMap 比 HashTable 更好? HashTable在什么情况下比另一种更好?【参考方案2】:ConcurrentHashMap
使用多个桶来存储数据。这避免了读锁,并大大提高了HashTable
的性能。两者都是线程安全的,但ConcurrentHashMap
有明显的性能优势。
当您使用get()
从ConcurrentHashMap
读取时,没有锁,这与所有操作都简单同步的HashTable
相反。
HashTable
是在 Java 的旧版本中发布的,而 ConcurrentHashMap
是 Java 5+ 的东西。
HashMap
是在单线程应用程序中使用的最佳选择。
【讨论】:
还有ConcurrentHashMap.putIfAbsent()
在旧的 Hashtable
中没有等效项。当你只从ConcurrentHashMap
读取时,没有锁,这与Hashtable
的所有操作都简单地同步。
@FrankPavageau 在原始答案中添加了您非常有用的 cmets。以上是关于Java中的ConcurrentHashMap和Hashtable [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Java中的ConcurrentHashMap和Hashtable [重复]
Java并发指南13:Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析
Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析