为ConcurrentHashMap选择并发级别的最佳方法是什么?

时间:2019-05-10 20:06:12

标签: java multithreading concurrency hashmap

我试图了解ConcurrentHashMap的并发级别如何工作(其构造函数的第三个参数),并且正在阅读本文-https://dzone.com/articles/how-concurrenthashmap-works-internally-in-java。具体来说,它将并发级别定义为

  

定义数字,该数字是并发的估计数量   更新线程。该实现执行内部大小调整以尝试   来容纳这么多线程。

然后定义如何使用

选择细分
Segment seg = segments[(hash & 0x1F)];

其中,“哈希”是要插入的对象的哈希码。我的问题是,由于您可能无法始终预测插入对象的哈希值,因此如果您的并发级别为16,从理论上讲,是否可以将所有对象都插入同一段中?如果是这样,总是根据可以访问数据结构的线程数来选择段数是否有意义,或者是否有更好的方法来选择并发级别?

1 个答案:

答案 0 :(得分:0)

使用自己的对象作为映射键时,可以完全控制hashCode的实现。例如,您可以将其定义为键的所有实例的常数0。这是一个有效的(非常不幸的)哈希函数。牢记这一点,在某些情况下,所有对象都被插入到同一段甚至同一容器中。

通常,特定的哈希值并不重要,但它们的统计属性却很重要。