这个问题的灵感来自this other question。
如果多个线程在synchronized
块上等待,并且锁定可用,谁先行?它是由线程优先级(然后是先来先服务)?
同样的规则适用于notify
(有多个wait
线程)?
答案 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个等待线程具有相同的优先级,并且第一个线程等待的次数超过第二个线程,这并不一定意味着将首先执行第一个线程。