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

时间:2017-04-12 09:56:31

标签: java multithreading synchronization thread-safety concurrenthashmap

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

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

1 个答案:

答案 0 :(得分:2)

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

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

当然,如果两个线程同时尝试访问相同的键,那么保证他们将访问同一个段,一个将被阻止,无论并发级别如何。

  

额外的线程会发生什么,他们是否会处于等待状态?

无。那是synchronized陈述的作用。在锁变为可用之前,它 nothing (a.k.a。,它" blocks")。然后,它获取锁,执行语句的主体,并释放锁。

  

他们将等待多久?

在互斥锁上阻塞的线程将保持阻塞状态,直到某个其他线程释放锁定为止。在设计良好的代码中,它应该只是非常的短时间 - 足够长,以便其他线程更新几个字段。

  

内部如何与其他线程进行通信?

不确定你的意思"内部"。被阻止的线程无法与其他线程通信。在取消阻止之前,它无法任何

也许您正在询问操作系统如何知道取消阻止的内容,以及何时。

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

不同操作系统用来选择要解除阻塞的线程的算法,以及保存和恢复线程上下文的方法(又名,"上下文切换")是比我有空间或时间讨论的更深层次的主题这里。