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

Thi*_*ilo 12 java multithreading jvm scheduling

这个问题的灵感来自另一个问题.

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

并且适用相同的规则notify(使用多个wait线程)?

小智 9

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

Java没有对序列发出任何保证.所以我猜它不是基于线程优先级

我将尝试进一步研究Java如何确定谁先行的解释.

  • 公平性是有代价的,可预测性是以大吞吐量下降为代价的.此外,公平性要求会阻止VM在实施锁定获取时所做的大量优化(诸如薄自旋锁之类的事情等). (5认同)
  • +1有趣.事实证明,并发包中的锁具有可选的公平模式,在这种情况下它们可以工作为fifo.如果不是,那就是任意的.我本以为线程优先级应该在这里发挥作用. (3认同)
  • @dmansfield我无法给出任何明确的答案,但看起来就像是我的代码中正在发生的那样。如果有人有更正式的答案,我想听听。 (2认同)

and*_*soj 5

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

Java的同步代码规则提供了一种互斥的方法,但不会阻止无限制的优先级反转,因此对于实时应用程序来说是不够的.该规范通过强制优先级反转控制来强化同步代码的语义,特别是通过提供优先级继承和优先级上限仿真的类.优先级继承在实时操作系统中更广泛地实现,因此是必需的,并且是本规范中的初始默认机制.