我试图了解 ConcurrentHashMap 的并发级别如何工作(其构造函数的第三个参数)并正在阅读这篇文章 - https://dzone.com/articles/how-concurrenthashmap-works-internally-in-java 。具体来说,它将并发级别定义为
Defines the number which is an estimated number of concurrently updating threads. The implementation performs internal sizing to try to accommodate this many threads.
然后定义如何使用选择分段
Segment seg = segments[(hash & 0x1F)];
其中“hash”是要插入的对象的哈希码。我的问题是,由于您可能并不总是能够预测插入对象的哈希值,因此如果您的并发级别为16,理论上是否会出现所有对象都插入到同一段中的情况?如果是这样,总是根据可以访问数据结构的线程数量来选择段数是否有意义,或者是否有更好的方法来选择并发级别?
最佳答案
当您使用自己的对象作为映射键时,您可以完全控制 hashCode
的实现。例如,您可以将其定义为所有键实例的常量值 0。这是一个有效的(也是非常不幸的)哈希函数。考虑到这一点,是的,在某些情况下,所有对象都被插入到同一个段,甚至同一个容器中。
一般来说,具体的哈希值并不重要,重要的是它们的统计属性。
关于java - 为 ConcurrentHashMap 选择并发级别的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56084175/