我想了解Semaphore
类中公平属性的用处。信号量级中的公平设置
具体引述的Javadoc提到:
一般来说,用于控制资源访问的信号量应该被初始化为公平的,以确保没有线程访问一个资源匮乏的。当使用信号量进行其他类型的同步控制时,非公平排序的吞吐量优势往往超过公平性考虑。
有人可以提供一个例子,其中可能需要在这里进行驳船。我无法想象过去的资源访问用例。此外,为什么默认是不公平的行为?
最后,在使用公平行为时是否会有任何性能影响?
我想了解Semaphore
类中公平属性的用处。信号量级中的公平设置
具体引述的Javadoc提到:
一般来说,用于控制资源访问的信号量应该被初始化为公平的,以确保没有线程访问一个资源匮乏的。当使用信号量进行其他类型的同步控制时,非公平排序的吞吐量优势往往超过公平性考虑。
有人可以提供一个例子,其中可能需要在这里进行驳船。我无法想象过去的资源访问用例。此外,为什么默认是不公平的行为?
最后,在使用公平行为时是否会有任何性能影响?
Java的内置并发结构(,wait()
,notify()
,...)不指定释放锁时哪个线程应该被释放。由JVM实现来决定使用哪种算法。
公平性给你更多的控制权:当锁被释放时,具有最长等待时间的线程被给予锁(FIFO处理)。如果没有公平性(并且算法非常糟糕),您可能会遇到线程始终等待锁定的情况,因为存在连续的其他线程流。
如果信号量被设置为公平的,则会有小的开销,因为它需要维护等待锁的所有线程的队列。除非您正在编写高吞吐量/高性能/多核应用程序,否则您不会看到差异!
场景,不需要
公平如果你有N个相同的工作线程,它并不重要的人得到的任务中执行
场景,需要公平
如果您有N个任务队列,您不希望一个队列永远等待并且永远不会获取锁定。