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

2022-09-04 03:09:35

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

如果多个线程正在等待一个块,并且锁定变得可用,那么谁先走?是否按线程优先级(然后是先到先得)?synchronized

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


答案 1

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

Java 对序列不作任何保证。所以我想它不是基于线程优先级

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


答案 2

其他人提到了公平锁的可用性。如果你真的在乎谁先走,那么你可能有一个实时问题。在这种情况下,您可以使用RTSJ,其中指定了锁获取的顺序和其他语义。有关详细信息,请参阅 RTSJ 规范“同步”下。引用基本原理部分:

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