我试图理解 Semaphore
类中的fairness属性的有用性。
专门引用Javadoc提到的是:
有人可以提供一个示例,在这里可能需要插入。我无法考虑过去的资源访问用例。另外,为什么默认是不公平行为?
最后,使用公平行为是否会对性能产生影响?
最佳答案
Java的内置并发构造(synchronized
,wait()
,notify()
,...)未指定释放锁时应释放哪个线程。由JVM实现决定使用哪种算法。
公平赋予您更多控制权:释放锁定时,将为等待时间最长的线程提供锁定(FIFO处理)。没有公平性(并且算法很差),您可能会遇到线程始终等待锁的情况,因为存在其他线程的连续流。
如果将信号量设置为公平,则开销很小,因为它需要维护所有等待锁定的线程的队列。除非您正在编写高吞吐量/高性能/许多内核的应用程序,否则您可能看不到区别!
不需要公平的场景
如果您有N个相同的工作线程,那么哪个任务可以执行就没关系
需要公平的场景
如果您有N个任务队列,则您不希望一个队列永远等待并且永远不会获得锁。