在 ConcurrentHashMap 中是否可以允许比并发级别更多的线程数?

Is it possible to allow more number of threads than concurrency level in ConcurrentHashMap?

假设我们有一个大小为 16 的 ConcurrentHashMap,即并发级别 16。如果在此映射上工作的线程数大于 16,即在 20 到 25 之间,那么额外的线程会发生什么情况,是否它们将处于等待状态状态?

如果是,那么它们将处于等待状态多长时间,以及它们将如何在内部与其他线程通信?

并发级别没有什么神奇之处。即使您的示例中 少于 个线程,它们在尝试访问地图时仍然会发生冲突。

如果并发级别为16,那么当任意两个线程尝试将两个不同的key放入map时,16中会有1次机会将两个key分配到同一个段。如果是这种情况,那么他们对段的访问将必须 序列化 。 (即,其中一个线程必须被阻塞,直到另一个线程完成。)

当然,如果两个线程同时尝试访问相同的键,那么保证它们将访问相同的键segment 和 one 都会被阻塞,不管并发级别是多少。

what will happen to the extra threads whether they will be in waiting state?

没有。这就是 synchronized 语句的作用。它什么都不做(a.k.a,"blocks")直到锁可用。然后,获取锁,执行语句体,释放锁。

how long they will be in waiting state?

被互斥锁阻塞的线程将保持阻塞状态,直到其他线程释放该锁。在设计良好的代码中,这应该只是 非常 的时间——刚好足以让另一个线程更新几个字段。

internally how they will communicate with other threads?

不确定 "internally" 是什么意思。被阻塞的线程不能与其他线程通信。它不能做任何事情,直到它被解锁。

也许您在问操作系统如何知道什么时候解除阻塞。

当一个线程试图锁定一个已经被其他线程使用的互斥量时,操作系统将挂起该线程,保存它的状态,并将一些代表该线程的令牌放入与关联的队列中互斥体。当线程的所有者释放互斥量时,OS 从队列中挑选一个线程,将互斥量的所有权转移给 selected 线程,恢复线程的保存状态,并让它 运行.

不同操作系统使用的算法select解除阻塞哪个线程,以及保存和恢复线程上下文的手段(a.k.a.,"context switch")是比有空有时间在这里讨论