gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:54:12 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

当然,如果两个线程尝试同时访问同一个键,那么保证它们将访问同一个段,并且其中一个线程将被阻塞,不无论并发级别是多少。

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

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

how long they will be in waiting state?

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

internally how they will communicate with other threads?

不知道你所说的“内部”是什么意思。被阻塞的线程无法与其他线程通信。在解锁之前它无法执行任何操作。

也许您会问操作系统如何知道要解锁什么以及何时解锁。

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

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

关于java - ConcurrentHashMap 是否可以允许比并发级别更多的线程数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43366250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com