关于hashmap:Java中的ConcurrentHashMap和Hashtable

ConcurrentHashMap and Hashtable in Java

本问题已经有最佳答案,请猛点这里访问。

Java中的并发流映射和哈希表之间的区别是什么?

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


ConcurrentHashMap and Hashtable locking mechanism

  • HashTable属于收集框架;ConcurrentHashMap属于执行框架。
  • HashTable对整个数据使用单锁。ConcurrentHashMap在段级(默认为16)上使用多个锁,而不是对象级,即整个Map
  • ConcurrentHashMap锁定仅适用于更新。对于检索,它允许完全并发,检索反映最近完成的更新操作的结果。因此,当使用锁完成写操作时,读取速度会非常快。
  • 如果一个线程试图修改它,而另一个线程正在迭代它,并且不允许空值,那么ConcurrentHashMap不会抛出ConcurrentModificationException
  • ConcurrentHashMap返回Iterator,在并发修改时,Iterator会安全失效(即迭代器会复制内部数据结构)。
  • ConcurrentHashMap使用数据库shards逻辑(Segment[] segments称为并发级别,即将数据划分为shards(段),然后对每个shard(段)加锁,而不是对整个数据加锁(Map)。默认值为16。

要更准确地理解Concurrenthashmap,请查看此链接

下面的类比只帮助您理解概念(而不是逻辑)

  • 假设HashTableConcurrentHashMap是两种类型的房屋。
  • HashTable锁住了家的大门。
  • ConcurrentHashMap锁定特定房间门,而不是主门。

Which is more efficient for threaded applications?

ConcurrentHashMap对于线程应用更有效。


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

当使用get()ConcurrentHashMap中读取时,没有锁,与HashTable相反,所有操作都是简单同步的。在旧版本的Java中释放了EDCOX1 1,而EDCOX1×0是Java 5 +的东西。

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