我试图了解公平属性在Semaphore
课堂上的用处。
特别引用Javadoc提到:
通常,用于控制资源访问的信号量应该被初始化为公平的,以确保没有线程因访问资源而被饿死。当使用信号量进行其他类型的同步控制时,非公平排序的吞吐量优势通常超过公平性考虑。
有人可以提供一个在这里可能需要闯入的例子。我想不出过去的资源访问用例。另外,为什么默认是不公平的行为?
最后,使用公平行为是否会对性能产生影响?
我试图了解公平属性在Semaphore
课堂上的用处。
特别引用Javadoc提到:
通常,用于控制资源访问的信号量应该被初始化为公平的,以确保没有线程因访问资源而被饿死。当使用信号量进行其他类型的同步控制时,非公平排序的吞吐量优势通常超过公平性考虑。
有人可以提供一个在这里可能需要闯入的例子。我想不出过去的资源访问用例。另外,为什么默认是不公平的行为?
最后,使用公平行为是否会对性能产生影响?
Java 的内置并发结构(synchronized
, wait()
, notify()
,...)没有指定释放锁时应该释放哪个线程。由 JVM 实现决定使用哪种算法。
公平给你更多的控制:当锁被释放时,等待时间最长的线程被赋予锁(先进先出处理)。如果没有公平性(并且使用非常糟糕的算法),您可能会遇到一个线程总是在等待锁定的情况,因为有连续的其他线程流。
如果将 Semaphore 设置为公平,则会有少量开销,因为它需要维护所有等待锁的线程的队列。除非您正在编写高吞吐量/高性能/多核应用程序,否则您可能看不到其中的区别!
不需要公平的场景
如果您有 N 个相同的工作线程,那么哪个执行任务并不重要
需要公平的场景
如果您有 N 个任务队列,您不希望一个队列永远等待并且永远不会获得锁。