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

标签 java multithreading concurrency hashmap

我试图了解 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/

相关文章:

java - ActiveMQ:如何平衡多个Message Broker实例之间的负载?

java多线程编程内存一致性问题

java - 同时向一个 URL 发送多个 POST 请求

java - 如何根据变量选择同一个表的不同数据

java.lang.ArrayIndexOutOfBoundsException : 0 异常

java - 提取 DBPedia Dump 期间 DBPedia 提取框架失败

c++ - 在构造函数中使用 "this"启动线程安全吗?

要使用的 Java ThreadPoolExecutor 和 BlockingQueue

java - 从同步列表中删除元素的正确方法

c# - 线程并发数据库查询是否安全?