Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当锁上有几个线程被阻塞时,它们以什么顺序恢复运行?_Java_Multithreading - Fatal编程技术网

Java 当锁上有几个线程被阻塞时,它们以什么顺序恢复运行?

Java 当锁上有几个线程被阻塞时,它们以什么顺序恢复运行?,java,multithreading,Java,Multithreading,线程A、B、C按该顺序到达单个对象中的同步方法f() 所有人都有同样的优先权 B和C被阻塞 A留下f() 现在哪个线程开始在f()中运行?它总是基于先进先出的原则吗?还是订单未定 如果C的优先级高于B,这是否保证C将运行而不是B?据我所知,这是未定义的 这也是件好事。如果您编写的代码依赖于优先级来确定执行顺序,那么您就错了。你要么明确地、有意地控制这些东西,要么为发生的一切做好准备。最好的方法是编写能够正常工作的代码 优先级是对运行时调度器的提示,而不是硬性指令。完全忽略优先级,或者按照与优先级

线程A、B、C按该顺序到达单个对象中的同步方法f()

所有人都有同样的优先权

B和C被阻塞

A留下f()

现在哪个线程开始在f()中运行?它总是基于先进先出的原则吗?还是订单未定


如果C的优先级高于B,这是否保证C将运行而不是B?

据我所知,这是未定义的

这也是件好事。如果您编写的代码依赖于优先级来确定执行顺序,那么您就错了。你要么明确地、有意地控制这些东西,要么为发生的一切做好准备。最好的方法是编写能够正常工作的代码


优先级是对运行时调度器的提示,而不是硬性指令。完全忽略优先级,或者按照与优先级无关的顺序安排线程,这是可能的,也是合法的。您所能期望的最好结果是,在IO等待等其他情况允许的情况下,平均而言,高优先级线程比低优先级线程获得更多的CPU时间。

顺序未定义。拥有更高的优先级并不保证首次恢复。更高的优先级意味着线程在运行时获得更多的CPU时间,但不需要实现首先为其提供锁


顺便说一句,没有办法编写确定性代码来保证您描述的A-B-C锁条目顺序。它不能用Java方法来完成。如果您编写的代码能够可靠地生成排序,那么您还没有对其进行足够的测试。由于您无法知道线程进入锁的顺序,因此您也无法知道它们离开锁的顺序-即使有FIFO策略。

这取决于操作系统的调度程序使用的算法。有关调度程序行为的更多信息,请参阅


但是,您可以通过各种方式来模拟所需的顺序。

与线程一样-您永远不知道。

对于所有应用程序意图和目的,您可以假定顺序是完全随机的。不要玩弄优先级-您很容易引入非常难以捕获的微妙bug。

当系统中所有可运行线程具有相同优先级时,调度程序会选择下一个线程以简单、非抢占、循环调度顺序运行

这还取决于操作系统和CPU的数量。如果有多个CPU和操作系统支持相同的线程,则可以执行多个线程

有趣的老链接:


它未指定/取决于平台。然而,Java信号量可以是公平的——这保证了FIFO。

实际上,更高的优先级甚至不能保证更多的CPU时间——这都是特定于平台的。不同的Java线程优先级可以映射到相同的操作系统优先级级别。@Péter Török我知道-我想我应该说“应该至少获得同样多的CPU时间”。像大多数线程一样,它是模糊的。重要的一点是,它在醒来时并不重要。“没有办法编写确保A-B-C锁条目排序的确定性代码。”多线程排序是可能的,例如使用队列,否?+1:大多数试图使用优先级来控制其程序的某些行为的人都有错误的想法,除了失败之外一无所获。而且,Java线程提供的保证比许多其他实现更少。大多数多线程程序在默认优先级的所有线程上都能很好地工作。谢谢,很高兴知道优先级——你是说(撇开优先级问题不谈)没有FIFO的保证吗?一点也不,它依赖于实现。你说的“信号量可以公平”是什么意思?您是指java.util.concurrent.Semaphore,并说虽然普通的同步方法没有FIFO,但信号量有FIFO吗?是的,完全正确。普通方法不能保证有FIFO(尽管它仍然可能有)。谢谢,很高兴知道优先级——你是说(撇开优先级问题)没有FIFO的保证吗?正确,绝对没有保证。在
java.util.concurrent
中可能有一些管道,您可以使用这些管道通过编程实现效果,但我不愿意探究这个问题来伤害我的大脑:)