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

以下类比仅帮助您理解概念(而非逻辑)

假设 HashtableConcurrentHashMap 是两种类型的 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:ConcurrentHashMap

Java并发指南13:Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析

Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析

解析 Java7/8 中的 HashMap 和 ConcurrentHashMap

Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析(上)