当多个线程被锁定时,它们以什么顺序恢复运行?

时间:2010-07-29 15:47:13

标签: java multithreading

按顺序线程A,B,C,在单个对象中到达 synchronized 方法 f()

所有人都有同样的优先权。

B和C被阻止。

叶子 f()

现在什么线程开始在 f()中运行?在FIFO的原则上它总是B吗?或者订单未确定?

如果C的优先级高于B,那么是否可以保证C运行而不是B?

7 个答案:

答案 0 :(得分:10)

对于所有应用程序意图和目的,您可以假设订单完全随机。不要玩优先级 - 您可以轻松地引入非常非常 非常难以捕获的微妙priority inversion错误。

答案 1 :(得分:5)

据我所知,这是未定义的。

也好。如果您正在编写依赖于优先级的编码来确定执行顺序,那么您做错了。你可以明确地和有意地控制这些东西,或者为发生的事情做好准备。最好是编写无论如何都能正常工作的代码。

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

答案 2 :(得分:3)

订单未定义。具有更高优先级并不能保证首次恢复。优先级越高意味着线程在运行时会占用更多的CPU时间,但不需要实现就可以先锁定它。

顺便说一句,没有办法编写确保代码来保证您描述的A-B-C锁定入口顺序。使用Java方法不能。如果您编写的代码认为可靠地生成该代码,那么您还没有对其进行足够的测试。由于您无法知道线程将以何种顺序进入锁定,因此您也无法知道它们将保留的顺序 - 即使存在FIFO策略。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

但你可以总是做一些技巧来模拟欲望的命令。

答案 5 :(得分:0)

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

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

有趣的旧链接:

http://journals.ecs.soton.ac.uk/java/tutorial/java/threads/priority.html

答案 6 :(得分:0)

它未指定/取决于平台。但是,Java 信号量可以是公平的 - 保证FIFO的目的。