【问题标题】:Key level locking in ConcurrentHashMapConcurrentHashMap 中的键级锁定
【发布时间】:2022-07-18 21:41:15
【问题描述】:

我了解 ConcurrentHashMap 使用存储桶级别锁定,而不是在修改操作时锁定整个映射对象。这允许尝试修改不同存储桶中的键的两个线程同时进行修改。但是如果线程试图修改同一个桶中的两个不同的键,那么一次将只允许一个。

我想了解,实现密钥级别锁定的挑战是什么,其中尝试修改不同密钥的线程始终允许同时修改。 SQL DB 实现行级锁定。他们如何能够有效地做到这一点?将 ConcurrentHashMap 中的 locks/concurrencyLevel 数量从默认值(我相信是 16)增加到更高数量的成本是多少?

【问题讨论】:

    标签: java multithreading concurrenthashmap


    【解决方案1】:

    即使您锁定了存储桶,您可能仍然需要锁定整个数据结构的操作。例如,您可能需要调整 Map 的大小,这需要您锁定整个数据结构(或所有存储桶),然后才能重新创建数据结构。

    除此之外,在锁定存储桶而不是整个数据结构时,性能甚至可能会更差。例如,您可能有频繁的操作需要获取多个锁(例如,遍历整个数据结构需要确保同时没有任何内容写入其中的任何部分)。需要检查多个锁是一种性能成本,它会随着要检查的锁数量的增加而增加。

    此外,锁的成本很高。它们需要额外的内存。如果你有很多很多的桶,你也需要很多锁,这些锁会累积起来。你拥有的锁越多,情况就越糟糕。

    最后,它会使您的实现复杂化并且容易出错,因为您可能会引入难以调试的逻辑错误。

    请注意,这些内容因应用程序而异/取决于您的用例。 如果您更改任何内容以获得更好的性能/并发性,请在更改前后检查并验证它是否变得更好。

    免责声明:这只是我想出的,可能还有其他问题/困难。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      相关资源
      最近更新 更多