代码之家  ›  专栏  ›  技术社区  ›  Thilo

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

  •  12
  • Thilo  · 技术社区  · 15 年前

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

    如果多个线程正在等待 synchronized 封锁,锁就可用了,谁先去?它是按线程优先级(然后先到先得)的吗?

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

    4 回复  |  直到 15 年前
        1
  •  9
  •   Mikkel Gadegaard    15 年前

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

    Java不能保证序列的正确性。所以我想这不是基于线程优先级的

    我将尝试进一步解释Java究竟是如何决定谁先行的。

        2
  •  5
  •   andersoj    15 年前

    其他人提到了公平锁的可用性。如果你真的关心谁先去,那么你可能会有一个实时问题。在这种情况下,您可以使用rtsj,其中指定了锁获取的顺序和其他语义。具体情况见 RTSJ Spec 在下面 同步 . 引用基本原理部分:

    同步代码的Java规则 提供相互排斥的方法 但不要阻止无限优先权 因此是不够的 用于实时应用程序。这个 规格加强了 同步代码的语义 强制优先级反转控制, 尤其是提供课程 优先级继承和优先级 天花板模拟。优先 继承得到了更广泛的实现 在实时操作系统和 因此是必需的,并且是初始的 此中的默认机制 规范。

        3
  •  1
  •   Jigar Joshi    15 年前

    第二个问题

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

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

        4
  •  0
  •   punkers    15 年前

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

    推荐文章