Java中的ConcurrentHashMap和Hashtable

she*_*aei 61 java hashtable hashmap

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

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

Pre*_*raj 115

ConcurrentHashMap和Hashtable锁定机制

  • Hashtable属于Collection框架; ConcurrentHashMap属于Executor框架.
  • Hashtable对整个数据使用单锁.在段级别上ConcurrentHashMap使用多个锁(默认为16)而不是对象级别,即整体Map.
  • ConcurrentHashMap锁定仅适用于更新.在检索的情况下,它允许完全并发,检索反映了最近完成的更新操作的结果.因此,使用锁完成写入时,读取可能会非常快.
  • ConcurrentHashMap不会抛出ConcurrentModificationException,如果一个线程试图另一种就是遍历它来修改它并不允许空值.
  • ConcurrentHashMap返回Iterator,在并发修改时失败安全(即迭代器将生成内部数据结构的副本).
  • ConcurrentHashMap使用数据库分片logic(Segment<K, V>[] segments)被称为并发级,即将数据分成碎片(段)而不是每个碎片(段)上的放置锁,而不是为整个数据(Map)放置一个锁.默认值为16.

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

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

  • 假设Hashtable并且ConcurrentHashMap是两种类型的房屋.
  • Hashtable 锁住家的大门.
  • ConcurrentHashMap 锁定特定的房间门而不是主门.

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

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

  • 主页示例赢得了所有理论:) (13认同)

Luc*_*olt 96

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

当您从ConcurrentHashMap使用中读取时get(),没有锁定,与HashTable所有操作简单同步的情况相反. HashTable在旧版本的Java中发布,而ConcurrentHashMapjava 5+ 则是一个东西.

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

  • 还有`ConcurrentHashMap.putIfAbsent()`在旧的`Hashtable`中没有等价物.当你只从`ConcurrentHashMap`读取时,没有锁,这与所有操作简单同步的`Hashtable`相反. (12认同)
  • @FrankPavageau 在原始答案中添加了您非常有用的评论。 (2认同)