按顺序线程A,B,C,在单个对象中到达 synchronized 方法 f()。
所有人都有同样的优先权。
B和C被阻止。
叶子 f()。
现在什么线程开始在 f()中运行?在FIFO的原则上它总是B吗?或者订单未确定?
如果C的优先级高于B,那么是否可以保证C运行而不是B?
答案 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的目的。