ConcurrentHashMap中是否可以有超过32个锁

DKS*_*ore 7 java performance multithreading locking concurrenthashmap

我读到ConcurrentHashMap在多线程方面比Hashtable更好,因为在桶级别而不是映射宽锁定.每张地图最多可锁32次.想知道为什么32和为什么不超过32锁.

Joh*_*lla 8

如果你在谈论Java ConcurrentHashMap,那么限制是任意的:

创建一个与给定地图具有相同映射的新地图.创建的映射的容量是给定映射中映射数的1.5倍或16(以较大者为准),默认加载因子(0.75)和concurrencyLevel(16).

如果你阅读了源代码,很明显最大段数是2 ^ 16,这对于不久的将来任何可能的需求都应该足够了.

您可能一直在考虑某些替代实验实现,如下所示:

此类支持硬连线预设并发级别32.这允许最多32个put和/或remove操作同时进行.

请注意,通常,当超过32个线程尝试更新单个数据时,除了同步效率之外的因素通常是瓶颈ConcurrentHashMap.


cle*_*tus 5

默认值不是 32,而是 16。您可以使用构造函数参数concurrency level覆盖它:

public ConcurrentHashMap(int initialCapacity,
                         float loadFactor,
                         int concurrencyLevel)
Run Code Online (Sandbox Code Playgroud)

所以你可以这样做:

Map<String, String> map = new ConcurrentHashmap<String, String)(128, 0.75f, 64);
Run Code Online (Sandbox Code Playgroud)

将其更改为 64。默认值是(从 Java 6u17 开始):

  • initialCapacity: 16;
  • loadFactory:0.75f;
  • concurrencyLevel: 16。

  • 那篇文章的日期是 2003 年 8 月 21 日,因此甚至早于 Java 5,因此它更像是一个预览版。始终在日期的背景下考虑此类信息。如有疑问,请访问 JDK 源代码。 (3认同)