【问题标题】:ConcurrentHashMap and Hashtable in Java [duplicate]Java中的ConcurrentHashMap和Hashtable [重复]
【发布时间】:2012-09-20 17:11:08
【问题描述】:

Java 中 ConcurrentHashMap 和 Hashtable 有什么区别?

哪个对线程应用程序更有效?

【问题讨论】:

标签: java hashmap hashtable


【解决方案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。
猜你喜欢
  • 2016-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 2018-09-23
相关资源
最近更新 更多