Java ConcurrentHashMap默认并发级别的原因
为什么默认并发级别为Java ConcurrentHashMap默认并发级别的原因,java,concurrency,concurrenthashmap,Java,Concurrency,Concurrenthashmap,为什么默认并发级别为ConcurrentHashMap16,为什么不是18?我刚刚检查了并发映射的实现,我发现如下: /** * The default concurrency level for this table. Unused but * defined for compatibility with previous versions of this class. */ private static final int DEFAULT_CONCURRENCY_LEVEL = 16;
ConcurrentHashMap
16,为什么不是18?我刚刚检查了并发映射的实现,我发现如下:
/**
* The default concurrency level for this table. Unused but
* defined for compatibility with previous versions of this class.
*/
private static final int DEFAULT_CONCURRENCY_LEVEL = 16;
它似乎只是为了与旧版本兼容而定义的
至于为什么是16而不是18。我猜这是因为它最好是2的幂,这是由于实现中的按位操作和更好的内存管理。我刚刚检查了并发映射的实现,我发现如下:
/**
* The default concurrency level for this table. Unused but
* defined for compatibility with previous versions of this class.
*/
private static final int DEFAULT_CONCURRENCY_LEVEL = 16;
它似乎只是为了与旧版本兼容而定义的
至于为什么是16而不是18。我想这是因为它最好是2的幂,因为在实现中采用了按位操作和更好的内存管理。早于Java8
ConcurrentyLevel表示并发hashmap需要多少内部hashmap才能正常工作。这基本上意味着您应该编写一个值,指出有多少线程将使用该并发hashmap。写入比实际线程更多的线程并不是性能损失,而是内存损失。我只能猜测为什么java开发人员决定选择16个,但这可能是由于处理器上的内核数等原因。您不想要18个,因为您可能没有18个内核/线程CPU,您可以有16个。它仍然是一个默认值,因此为了获得最佳性能,您需要设置它
JAVA 8之后:
不再使用此并发级别;)它留在构造函数中只是为了与旧代码兼容。早于JAVA 8
ConcurrentyLevel表示并发hashmap需要多少内部hashmap才能正常工作。这基本上意味着您应该编写一个值,指出有多少线程将使用该并发hashmap。写入比实际线程更多的线程并不是性能损失,而是内存损失。我只能猜测为什么java开发人员决定选择16个,但这可能是由于处理器上的内核数等原因。您不想要18个,因为您可能没有18个内核/线程CPU,您可以有16个。它仍然是一个默认值,因此为了获得最佳性能,您需要设置它
JAVA 8之后:
不再使用此并发级别;)它留在构造函数中只是为了与旧代码兼容。问题“为什么默认值不是我想要的值”的基本答案通常是:因为您的用例是特定于您的,而不一定是一般情况下的好用例 (另一个可能的答案是:他们选择了任意但合理的违约) 不管什么原因,它都有那个值,所以您可以将该类与默认值一起使用,或者使用它的API来指定不同的值;或者您可以使用不同的类;或者,您可以向类的维护人员提供理由,说明为什么它应该具有不同的值
在这种情况下,有一个构造函数允许您指定并发级别,因此只需指定您想要的值。对于“为什么默认值不是我想要的值”这一问题的基本答案通常是:因为您的用例是特定于您的,而不一定是好的 (另一个可能的答案是:他们选择了任意但合理的违约) 不管什么原因,它都有那个值,所以您可以将该类与默认值一起使用,或者使用它的API来指定不同的值;或者您可以使用不同的类;或者,您可以向类的维护人员提供理由,说明为什么它应该具有不同的值
在本例中,有一个构造函数允许您指定并发级别,因此只需指定所需的值。
并发级别
表示碎片的数量。
它用于在内部将ConcurrentHashMap
划分为这个数量的分区,并创建相同数量的线程,以维护在碎片级别维护的线程安全。
“ConcurrentyLevel”的默认值为
十六,
这意味着每当我们使用默认构造函数创建ConcurrentHashMap实例时,甚至在添加第一个键值对之前,16个碎片
。
它还意味着为各种内部类创建实例,如ConcurrentHashMap$Segment、ConcurrentHashMap$HashEntry[]和ReentrantLock$NonfairSync
在大多数情况下,在正常应用中
单个分片能够处理具有合理键值对计数的多个线程。而且性能也将是最佳的。拥有多个碎片只会在内部使事情变得复杂,并为垃圾收集引入许多不必要的对象,而所有这些都没有提高性能
最好保持并发级别
最小。
请注意,如果您正在使用<代码>非常高并发应用程序 <代码>非常高的更新频率在<代码> CONCURNESHASMAP ,那么只有您应该考虑<代码>增加并发级别< /代码>,但同样,它应该是一个经过良好计算的数字,以获得最佳结果。并发级别
表示碎片的数量。
它用于在内部将ConcurrentHashMap
划分为这个数量的分区,并创建相同数量的线程,以维护在碎片级别维护的线程安全。
“ConcurrentyLevel”的默认值为
十六,
这意味着每当我们使用默认构造函数创建ConcurrentHashMap实例时,甚至在添加第一个键值对之前,16个碎片
。
它还意味着为各种内部类创建实例,如ConcurrentHashMap$Segment、ConcurrentHashMap$HashEntry[]和ReentrantLock$NonfairSync
在大多数情况下,在正常应用中
单个分片能够处理多个线程,并且具有合理的线程数