信号量类中的公平性设置

2022-09-01 22:55:01

我试图理解Semaphore类中公平属性的有用性。

具体引用Javadoc提到:

通常,用于控制资源访问的信号量应初始化为 fair,以确保没有线程被阻止访问资源。将信号量用于其他类型的同步控制时,非公平排序的吞吐量优势通常超过公平性考虑因素。

有人可以举个例子,在这里可能需要驳船。我无法想到过去的资源访问用例。另外,为什么默认是非公平行为?

最后,使用公平行为是否有任何性能影响?


答案 1

Java 的内置并发构造(、 、 ,...) 没有指定在释放锁时应释放哪个线程。由 JVM 实现决定使用哪种算法。synchronizedwait()notify()

公平性为您提供了更多的控制:当锁定被释放时,等待时间最长的线程被赋予锁定(FIFO处理)。如果没有公平性(并且算法非常糟糕),您可能会遇到线程总是在等待锁定的情况,因为存在其他线程的连续流。

如果 Semaphore 设置为公平,则开销很小,因为它需要维护等待锁定的所有线程的队列。除非您正在编写高吞吐量/高性能/多核应用程序,否则您可能不会看到其中的区别!

不需要公平的场景

如果您有 N 个相同的工作线程,则哪个线程获取要执行的任务并不重要

需要公平的场景

如果您有 N 个任务队列,则不希望一个队列永远等待并且永远不会获取锁。


答案 2