Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ConcurrentHashMap默认并发级别的原因_Java_Concurrency_Concurrenthashmap - Fatal编程技术网

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

在大多数情况下,在正常应用中

单个分片能够处理多个线程,并且具有合理的线程数