这个问题的灵感来自于 这个问题。
如果有多个线程在等待 synchronized
阻止,锁定变得可用,谁先走?它是由线程优先级(然后先来先服务)?
并且适用相同的规则 notify
(有多个 wait
线程)?
这个问题的灵感来自于 这个问题。
如果有多个线程在等待 synchronized
阻止,锁定变得可用,谁先走?它是由线程优先级(然后先来先服务)?
并且适用相同的规则 notify
(有多个 wait
线程)?
据这家伙说: http://tutorials.jenkov.com/java-concurrency/starvation-and-fairness.html
Java不对序列发出任何保证。所以我猜它不是基于线程优先级
我将尝试进一步研究Java如何确定谁先行的解释。
其他人提到了公平锁的可用性。如果您真的关心谁先行,那么您可能会遇到实时问题。在这种情况下,您可以使用RTSJ,其中指定了锁获取的排序和其他语义。具体细节见 RTSJ规格 下 同步。引用理由部分:
Java的同步代码规则 提供互斥的手段 但不要阻止无限制的优先权 反转因而不足 用于实时应用程序。这个 规范加强了 同步代码的语义 强制优先反转控制, 特别是通过装修课程 优先级继承和优先级 天花板仿真。优先 继承得到更广泛的实施 在实时操作系统和 因此是必需的并且是最初的 这个默认机制 规范。
为你的第二个问题
其中一个被选中被唤醒。选择是任意的,由实施决定。线程通过调用其中一个wait方法等待对象的监视器。
从 http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#notify()
它取决于线程优先级和线程调度算法,并且同步块上的锁定也不“公平”。这意味着如果有2个等待线程具有相同的优先级,并且第一个线程等待的次数超过第二个线程,这并不一定意味着将首先执行第一个线程。