我正在努力了解公平财产在
Semaphore
年级的有用性.
具体地引用Javadoc提到:
Generally,semaphores used to control resource access should be initialized as fair,to ensure that no thread is starved out from accessing a resource. When using semaphores for other kinds of synchronization control,the throughput advantages of non-fair ordering often outweigh fairness considerations.
有人可以提供一个例子,在这里可能需要驳船.我不能想到过去的资源访问用例.另外,为什么默认是非公平的行为?
最后,使用公平行为有什么性能影响?
解决方法
Java的内置并发结构(synchronized,wait(),notify(),…)不指定在释放锁时应该释放哪个线程.由JVM实现决定要使用哪种算法.
公平给你更多的控制:当锁释放时,等待时间最长的线程被赋予锁(FIFO处理).没有公平(并且使用非常糟糕的算法),您可能会遇到一个线程总是等待锁的情况,因为有一个连续的其他线程流.
如果信号量被设置为公平,那么它的开销很小,因为它需要维护所有等待锁的线程的队列.除非您正在撰写高吞吐量/高性能/许多内核应用程序,否则您不会看到差异!
不需要公平的场景
如果你有N个相同的工作线程,那么任何一个任务执行就没关系
需要公平的场景
如果您有N个任务队列,则不需要一个队列永远等待,从不获取锁定.