Java中的 ConcurrentHashMap 和 Hashtable

2022-08-31 11:33:50

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

对于线程化应用程序,哪种方法更有效?


答案 1

ConcurrentHashMap 和 Hashtable 锁定机制

  • Hashtable属于集合框架; 属于执行器框架。ConcurrentHashMap
  • Hashtable对整个数据使用单锁。 在段级别(默认为 16)上使用多个锁,而不是对象级别,即整个 。ConcurrentHashMapMap
  • ConcurrentHashMap锁定仅适用于更新。在检索的情况下,它允许完全并发,检索反映最近完成的更新操作的结果。因此,当写入是使用锁完成的时,读取可以非常快地发生。
  • ConcurrentHashMap如果一个线程尝试修改它,而另一个线程正在迭代它并且不允许空值,则不会抛出它。ConcurrentModificationException
  • ConcurrentHashMap返回 ,在并发修改时失败安全(即迭代器将创建内部数据结构的副本)。Iterator
  • ConcurrentHashMap使用数据库分片逻辑()称为并发级别,即将数据划分为分片(段),然后在每个分片(段)上放置锁,而不是为整个数据放置单个锁()。默认值为 16。Segment<K, V>[] segmentsMap

要更技术地了解 ConcurrentHashMap,请查看此链接

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

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

对于线程化应用程序,哪种方法更有效?

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


答案 2

ConcurrentHashMap使用多个存储桶来存储数据。这避免了读锁定,并大大提高了 与 .两者都是线程安全的,但 具有明显的性能优势。HashTableConcurrentHashMap

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

HashMap是在单线程应用程序中使用的最佳方法。