我试图了解ConcurrentHashMap的并发级别如何工作(其构造函数的第三个参数),并且正在阅读本文-https://dzone.com/articles/how-concurrenthashmap-works-internally-in-java。具体来说,它将并发级别定义为
定义数字,该数字是并发的估计数量 更新线程。该实现执行内部大小调整以尝试 来容纳这么多线程。
然后定义如何使用
选择细分Segment seg = segments[(hash & 0x1F)];
其中,“哈希”是要插入的对象的哈希码。我的问题是,由于您可能无法始终预测插入对象的哈希值,因此如果您的并发级别为16,从理论上讲,是否可以将所有对象都插入同一段中?如果是这样,总是根据可以访问数据结构的线程数来选择段数是否有意义,或者是否有更好的方法来选择并发级别?
答案 0 :(得分:0)
使用自己的对象作为映射键时,可以完全控制hashCode
的实现。例如,您可以将其定义为键的所有实例的常数0。这是一个有效的(非常不幸的)哈希函数。牢记这一点,在某些情况下,所有对象都被插入到同一段甚至同一容器中。
通常,特定的哈希值并不重要,但它们的统计属性却很重要。