【问题标题】:ConcurrentHashMap and Hash table difference [duplicate]ConcurrentHashMap和哈希表的区别[重复]
【发布时间】:2015-02-20 19:54:36
【问题描述】:

我是 Java 和 stackoverflow 的新手,正在向从事 Collections Framework 工作的有经验的人寻求答案。

我读到 hashTable 是线程安全的,concurrentHashMap 也是如此,但是 concurrentHashMap 比 hashTable 快,因为它可以将映射的段锁定给访问线程。

这在内部是如何工作的?段的大小是如何决定的?示例:如果 concurrentHashMap 中有 40 个条目,并且有 3 个线程尝试检索/修改数据,则如何确定段?

任何关于此的图像/解释/代码都会非常棒。提前致谢。

【问题讨论】:

  • 基本上 ConcurrentHashMap 具有更好的性能,因为使用 CAS 操作而不是导致许多上下文切换和等待的锁定来实现。
  • 这是一篇关于 ConcurrentHashMap 的优秀文章:burnison.ca/articles/the-concurrency-of-concurrenthashmap
  • 谢谢,这真的很有帮助。不知道为什么它被标记为重复,因为另一个问题是“HashMap 和 HashTable 之间的差异”

标签: java multithreading


【解决方案1】:

concurrentHashMap - 无锁算法。读写操作之间没有同步。 根据 java Doc

支持全并发检索和可调整的哈希表 更新的预期并发。此类遵循相同的功能 规范为 Hashtable,并包括方法的版本 对应Hashtable的各个方法。然而,即使所有 操作是线程安全的,检索操作不需要 锁定,并且不支持将整个表锁定在 一种阻止所有访问的方法。这个类是完全可互操作的 程序中的哈希表依赖于其线程安全但不依赖于其 同步详情。

HashTable - 一切都是同步的。它在读写操作之间完全同步

【讨论】:

  • 谢谢西瓦。 “检索操作不需要锁定”这意味着写操作会锁定段吗? “不支持以阻止所有访问的方式锁定整个表”这一行表明某些部分被锁定但不是整个表。您能否解释一下线程是否在任何时候都获得了表/段上的任何锁?
  • ConcurrentHashMap 不是无锁的。
  • Steven 是对的,CHM 肯定不是无锁的。 ConcurrentLinkedQueue 是无锁的,但 CHM 使用分段锁。
猜你喜欢
  • 2010-10-26
  • 2021-04-06
  • 2016-03-20
  • 2011-05-24
  • 2020-12-20
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 2012-04-03
相关资源
最近更新 更多