信号量类中的公平设置

时间:2013-07-24 04:57:15

标签: java multithreading semaphore

我试图理解Semaphore课程中公平财产的用处。

特别引用Javadoc提到:

  

通常,用于控制资源访问的信号量应初始化为公平,以确保没有线程缺乏访问资源。当使用信号量进行其他类型的同步控制时,非公平排序的吞吐量优势往往超过公平性考虑。

有人可以提供一个示例,其中可能需要进行插入。我想不到过去的资源访问用例。另外,为什么默认是非公平行为?

最后,使用公平行为会对绩效产生什么影响?

1 个答案:

答案 0 :(得分:26)

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

公平性为您提供更多控制:当锁定被释放时,具有最长等待时间的线程被赋予锁定(FIFO处理)。如果没有公平性(并且使用非常糟糕的算法),您可能会遇到线程始终在等待锁定的情况,因为存在连续的其他线程流。

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

不需要公平的情景

如果您有N个相同的工作线程,那么哪个任务执行

并不重要

需要公平的情景

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