java – 信号量类中的公平设置

我正在努力了解公平财产在 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个任务队列,则不需要一个队列永远等待,从不获取锁定.

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...