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

时间:2010-10-15 07:06:11

标签: java multithreading jvm scheduling

这个问题的灵感来自this other question

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

同样的规则适用于notify(有多个wait线程)?

4 个答案:

答案 0 :(得分:9)

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

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

我将尝试进一步寻找有关Java如何确定谁先行的解释。

答案 1 :(得分:5)

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

  

Java的同步代码规则   提供互斥的手段   但不要阻止无限制的优先权   反转因而不足   用于实时应用程序。这个   规范加强了   同步代码的语义   强制优先反转控制,   特别是通过装修课程   优先级继承和优先级   天花板仿真。优先   继承得到更广泛的实施   在实时操作系统和   因此是必需的并且是最初的   这个默认机制   说明书

答案 2 :(得分:1)

第二个问题

  

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

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

答案 3 :(得分:0)

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