Java:等待同步块,谁先走?

这个问题的灵感来自另一个问题 。

如果多个线程在synchronized块上等待,并且锁定可用,谁先进行? 它是由线程优先级(然后先来先服务)?

并且相同的规则适用于notify (具有多个wait线程)?

根据这个家伙: http : //tutorials.jenkov.com/java-concurrency/starvation-and-fairness.html

Java不对序列发出任何保证。 所以我猜它不是基于线程优先级

我将尝试进一步研究Java如何确定谁先行的解释。

其他人提到了公平锁的可用性。 如果您真的关心谁先行,那么您可能会遇到实时问题。 在这种情况下,您可以使用RTSJ,其中指定了锁获取的排序和其他语义。 详细信息可在同步下的RTSJ规范中找到。 引用理由部分:

Java的同步代码规则提供了一种互斥的方法,但不会阻止无限制的优先级反转,因此对于实时应用程序来说是不够的。 该规范通过强制优先级反转控制来强化同步代码的语义,特别是通过提供优先级inheritance和优先级上限仿真的类。 优先级inheritance在实时操作系统中更广泛地实现,因此是必需的,并且是本规范中的初始默认机制。

为你的第二个问题

其中一个被选中被唤醒。 选择是任意的,由实施决定。 线程通过调用其中一个wait方法等待对象的监视器。

来自http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#notify ()

它取决于线程优先级和线程调度算法,并且同步块上的锁定也不“公平”。 这意味着如果有2个等待线程具有相同的优先级,并且第一个线程等待的次数超过第二个线程,这并不一定意味着将首先执行第一个线程。