Java 在ConcurrentHashMap中允许的线程数是否可能超过并发级别?

Java 在ConcurrentHashMap中允许的线程数是否可能超过并发级别?,java,multithreading,synchronization,thread-safety,concurrenthashmap,Java,Multithreading,Synchronization,Thread Safety,Concurrenthashmap,假设我们有一个大小为16的ConcurrentHashMap,即并发级别16。如果在这个映射上工作的线程数大于16,即20到25,那么额外的线程会发生什么情况?它们是否处于等待状态 如果是,那么它们将处于等待状态多长时间,以及它们将如何与其他线程进行内部通信?并发级别没有什么神奇之处。即使示例中的线程少于16个,它们在尝试访问映射时仍可能发生冲突 如果并发级别为16,那么当任何两个线程尝试将两个不同的键放入映射时,16个线程中有一个机会将这两个键分配给同一个段。如果是这种情况,那么他们对该段的访

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


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

并发级别没有什么神奇之处。即使示例中的线程少于16个,它们在尝试访问映射时仍可能发生冲突

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

当然,如果两个线程试图同时访问同一个密钥,那么无论并发级别如何,都可以保证它们将访问同一个段,其中一个将被阻止

无论额外线程是否处于等待状态,它们都会发生什么情况

没什么。这就是
synchronized
语句所做的。在锁可用之前,它不会执行任何操作(也称为“阻塞”)。然后,它获取锁,执行语句体,然后释放锁

他们将等待多久

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

在内部,它们将如何与其他线程通信

不知道你所说的“内部”是什么意思。被阻止的线程无法与其他线程通信。它不能做任何事情,直到它被解锁

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

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


不同操作系统用于选择要解除阻止的线程的算法,以及保存和恢复线程上下文的方法(也称为“上下文切换”)都是比我在这里讨论的空间和时间更深的主题。

并发级别没有什么神奇之处。即使示例中的线程少于16个,它们在尝试访问映射时仍可能发生冲突

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

当然,如果两个线程试图同时访问同一个密钥,那么无论并发级别如何,都可以保证它们将访问同一个段,其中一个将被阻止

无论额外线程是否处于等待状态,它们都会发生什么情况

没什么。这就是
synchronized
语句所做的。在锁可用之前,它不会执行任何操作(也称为“阻塞”)。然后,它获取锁,执行语句体,然后释放锁

他们将等待多久

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

在内部,它们将如何与其他线程通信

不知道你所说的“内部”是什么意思。被阻止的线程无法与其他线程通信。它不能做任何事情,直到它被解锁

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

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


不同操作系统用于选择要解除阻止的线程的算法,以及保存和恢复线程上下文的方法(也称为“上下文切换”)都是比我在这里讨论的空间和时间更深的主题。

你至少读过CHM的Javadoc吗?你至少读过CHM的Javadoc吗?