88

Java 中的 ConcurrentHashMap 和 Hashtable 有什么区别?

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

4

2 回答 2

172

ConcurrentHashMap 和 Hashtable 锁定机制

  • Hashtable属于Collection框架;ConcurrentHashMap属于Executor框架。
  • Hashtable对整个数据使用单个锁ConcurrentHashMap在段级别使用多个锁(默认为 16 个)而不是对象级别,即整体Map
  • ConcurrentHashMap锁定仅适用于更新。在检索的情况下,它允许完全并发,检索反映最近完成的更新操作的结果。因此,当使用锁完成写入时,读取可能会非常快。
  • ConcurrentHashMapConcurrentModificationException如果一个线程尝试修改它,而另一个线程正在迭代它并且不允许空值,则不会抛出。
  • ConcurrentHashMapreturn ,它在并发修改时Iterator是故障安全的(即迭代器将复制内部数据结构)。
  • ConcurrentHashMap使用数据库分片逻辑(Segment<K, V>[] segments)被称为并发级别,即将数据划分为分片(段),然后在每个分片(段)上加锁,而不是为整个数据加一个锁(Map)。默认值为 16。

要从技术上更深入地了解 ConcurrentHashMap,请查看此链接

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

  • 假设HashtableConcurrentHashMap是两种类型的家。
  • Hashtable锁住家的大门。
  • ConcurrentHashMap锁定特定的房间门而不是大门。

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

ConcurrentHashMap对于线程应用程序更有效。

于 2015-07-23T06:16:09.947 回答
125

ConcurrentHashMap使用多个桶来存储数据。这避免了读锁,并大大提高了性能HashTable。两者都是线程安全的,但使用ConcurrentHashMap.

当您从ConcurrentHashMapusing中读取时get(),没有锁,这与HashTable所有操作都只是同步的相反。 HashTable是在旧版本的 Java 中发布的,而ConcurrentHashMap它是 Java 5+ 的东西。

HashMap是在单线程应用程序中使用的最佳选择。

于 2012-09-28T19:48:12.277 回答