我试图了解 Semaphore
中公平属性的用处|类(class)。
特别是引用 Javadoc 提到的:
Generally, semaphores used to control resource access should be initialized as fair, to ensure that no thread is starved out from accessing a resource. When using semaphores for other kinds of synchronization control, the throughput advantages of non-fair ordering often outweigh fairness considerations.
有人可以提供一个示例,说明此处可能需要打断。我无法思考过去的资源访问用例。另外,为什么默认是不公平的行为?
最后,使用公平行为是否会对性能产生影响?
最佳答案
Java 的内置并发结构(synchronized
、wait()
、notify()
,...)不指定哪个线程释放锁时应该释放。由 JVM 实现决定使用哪种算法。
公平性给了你更多的控制权:当锁被释放时,等待时间最长的线程被赋予锁(先进先出处理)。如果没有公平性(并且使用非常糟糕的算法),您可能会遇到这样一种情况,即一个线程总是在等待锁,因为有一个连续的其他线程流。
如果将信号量设置为公平,则开销很小,因为它需要维护所有等待锁的线程的队列。除非您正在编写高吞吐量/高性能/多核应用程序,否则您可能看不出其中的区别!
不需要公平的场景
如果你有 N 个相同的工作线程,那么哪一个执行任务并不重要
需要公平的场景
如果您有 N 个任务队列,您不希望一个队列永远等待并且永远不会获取锁。
关于java - 信号量类中的公平设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17825508/