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

标签 java multithreading semaphore

我试图了解 Semaphore 中公平属性的用处|类(class)。

特别是引用 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 的内置并发结构(synchronizedwait()notify(),...)不指定哪个线程释放锁时应该释放。由 JVM 实现决定使用哪种算法。

公平性给了你更多的控制权:当锁被释放时,等待时间最长的线程被赋予锁(先进先出处理)。如果没有公平性(并且使用非常糟糕的算法),您可能会遇到这样一种情况,即一个线程总是在等待锁,因为有一个连续的其他线程流。

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

不需要公平的场景

如果你有 N 个相同的工作线程,那么哪一个执行任务并不重要

需要公平的场景

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

关于java - 信号量类中的公平设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17825508/

相关文章:

java - 如何将包从 jar 文件导入到在 tomcat 8 上运行的 servlet 中?

java - 如何在跨平台环境中使用JNA获取Java中正在运行的进程列表?

java - 如何将txt文件读取到android项目文件夹中

java - 同步:为什么优先锁定一个private final静态对象而不是类的类对象?

multithreading - 互斥锁、信号量和自旋锁之间的区别

c++ - 信号量一释放就启动线程

c - 在队列的关键部分使用二进制信号量而不是互斥锁进行互斥有什么好处吗?

java - Eclipse 中 Android 应用程序项目缺少文件

java - 惰性初始化 ="true"。它有什么作用?为什么我无法从 Swing 应用程序获取 Spring bean,而无需将lazy-init 设置为 true?

multithreading - 混合线程、 fork 和互斥锁,我应该注意什么?