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

专门引用Javadoc提到的是:



有人可以提供一个示例,在这里可能需要插入。我无法考虑过去的资源访问用例。另外,为什么默认是不公平行为?

最后,使用公平行为是否会对性能产生影响?

最佳答案

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

公平赋予您更多控制权:释放锁定时,将为等待时间最长的线程提供锁定(FIFO处理)。没有公平性(并且算法很差),您可能会遇到线程始终等待锁的情况,因为存在其他线程的连续流。

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

不需要公平的场景

如果您有N个相同的工作线程,那么哪个任务可以执行就没关系

需要公平的场景

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

10-06 03:17