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

Jos*_*Fox 5 java multithreading

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

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

B和C被阻止.

叶子f().

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

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

Nik*_*sov 10

对于所有应用程序意图和目的,您可以假设订单是完全随机的.不要玩优先级 - 你可以很容易地引入非常非常难以捕获的微妙的优先级反转错误.


Car*_*icz 5

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

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

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


Bor*_*lid 3

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

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