【发布时间】:2022-01-09 22:29:24
【问题描述】:
我在浏览可重入锁的Java文档时发现了以下文字:
锁的公平性并不能保证线程调度的公平性。因此,使用公平锁的许多线程之一可能会连续多次获得它,而其他活动线程没有进展并且当前没有持有锁。
根据我的理解,这意味着,如果操作系统调度程序调度相同的线程(之前获取锁)并尝试再次获取相同的锁,Java 将允许它获取并且不会遵守公平参数值.有人可以告诉我们公平参数的目的是什么以及应该在什么情况下使用它。
我只是在想它是否只是一个优先级值,这可能会影响调度程序但不能保证线程执行顺序。
【问题讨论】:
-
线程调度的不同之处在于,您可以拥有比系统拥有的内核多很多倍的活动线程,因此有些线程正在等待获得处理时间。另一方面,如果多个线程正在积极尝试获取锁,则锁的公平性参数将影响它们中的哪一个获得它。文档所说的是,您可能有许多线程可能想要锁定,但如果线程调度程序只执行其中一个线程,即使它之前已经持有它也会获得锁定。
-
@Thomas 所以它就像对操作系统的提示。与优先级值相同。
-
不,不是,锁自己处理公平性。 Thead 调度也将由 JVM 处理,但也会受到操作系统的影响,即 JVM 进程本身的调度方式。对于锁,请考虑以下情况:线程 A 获得锁并释放它,现在线程 A 和 B 会再次想要锁,但由于 B 的调度晚于 A,A 再次获得锁,因为没有人在等待它(B 没有'不要尝试获取锁)。
-
@Thomas 你知道线程 B 不会被考虑,因为当 A 再次尝试获取锁时,它处于阻塞状态而不是可运行状态?
-
不,B 可能处于活动状态且可运行,但调度程序可能只是不运行它或出于任何原因足够早地运行它。这两个概念只是松散相关 - 检查所罗门和霍尔格的答案,他们正在更详细地描述这一点。
标签: java multithreading locking