【问题标题】:Java: waiting on synchronized block, who goes first?Java:等待同步块,谁先走?
【发布时间】:2011-04-25 19:20:44
【问题描述】:

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

如果多个线程在一个synchronized 块上等待,并且锁可用,谁先去?是按线程优先级(然后是先到先得)吗?

同样的规则是否适用于notify(具有多个waiting 线程)?

【问题讨论】:

  • 如果您正在寻找“公平锁”,请查看 java.util.concurrent 包。例如,ReEntrantLocks 是公平的。公平性来自这样一个事实,即优先考虑最长等待的线程,类似于进程调度中的“老化”概念。

标签: java multithreading jvm scheduling


【解决方案1】:

据此人说:http://tutorials.jenkov.com/java-concurrency/starvation-and-fairness.html

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

我将尝试进一步寻找关于 Java 实际如何决定谁先走的解释。

【讨论】:

  • +1 有趣。事实证明,并发包中的锁具有可选的公平模式,在这种情况下它们可以使用 fifo。如果不是,那是任意的。我会认为线程优先级应该在这里发挥作用。
  • 我同意这是“自然”的选择。
  • 公平是有代价的,而可预测性的实现是以吞吐量大幅下降为代价的。此外,公平性要求会阻止 VM 在实现锁定获取时可能进行的大量优化(例如瘦自旋锁等)。
  • 关于这个的一个问题:如果线程 1 是监视器的持有者并且其他线程正在等待,线程 1 是否有可能在任何已经等待的线程之前解锁并“四处奔走”并再次获得锁线程?
  • @dmansfield 我不能给出任何明确的答案,但我的代码中似乎就是这样。如果有人有更正式的答案,我想听听。
【解决方案2】:

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

Java 的同步代码规则 提供相互排斥的手段 但不要阻止无限优先级 倒置,因此是不够的 用于实时应用。这 规范加强了 同步代码的语义 强制优先反转控制, 特别是通过布置课程 用于优先继承和优先级 天花板仿真。优先 继承得到更广泛的实现 在实时操作系统和 因此是必需的并且是初始的 这里面的默认机制 规范。

【讨论】:

    【解决方案3】:

    第二个问题

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

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

    【讨论】:

    • 知道 Hotspot 是如何处理这个问题的吗?
    • 如果我将这两个答案与不会导致 Linux 上的操作系统线程优先级的线程优先级(至少在大多数情况下)一起使用,那么这些优先级似乎并没有多大作用......
    • @Thilo 这取决于实现。我不能说这取决于操作系统。
    • @Thilo,您打算根据行为编写代码吗?
    • 我实际上相信它也依赖于操作系统,因为除了少量的自旋锁定(可能 10000 次尝试或 10us 尝试)之外,它会让操作系统实际处理它。
    【解决方案4】:

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

    【讨论】:

    • 你是说优先级越高?
    • 不,对不起,我没有这么说,我错过了那个案子。我的意思是,由于公平性,即使是具有较高优先级的线程也可以在具有较低优先级的线程之后执行。这是因为不公平锁提供了较弱的活性保证,要求所有线程最终都将获得锁。
    • 锁是不公平的,高优先级线程比低优先级线程更有可能成功获取锁的唯一方法是低优先级线程本身缺乏执行时间。
    猜你喜欢
    • 2022-01-04
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 2013-10-12
    相关资源
    最近更新 更多