java - Java中的ConcurrentHashMap和Hashtable

标签 java hashmap hashtable

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

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

最佳答案

ConcurrentHashMap and Hashtable locking mechanism

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

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

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

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

Which is more efficient for threaded applications?

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

关于java - Java中的ConcurrentHashMap和Hashtable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12646404/

相关文章:

java 8 过滤一个 ListOfMap 用于检查一个键是否存在,如果存在则收集一个映射

java - 插入到 HashMap 中会导致排序困惑

c++ - 使数组更节省内存

Java CRC32 : not the same as CRC from C#

java - 使用 spring-hateoas 反序列化包含(_links 和 _embedded)的 JSON

java - 如何从 doPost() 获取和使用 jsp 文件中的 java 对象?

Java - 添加一个对象而不引用原始对象

java - Hashtable 是否实现了 Map 接口(interface)中的每个方法?

c# - 为什么字典不像哈希表那样访问不存在的键?

java - 解析日期并在 Java 中遇到 'static reference to the non-static method' 错误