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 - Android改变Imagebutton的图片资源

java - 并发HashMap : Can we trust on it?

list - FreeRTOS 无限地停留在 vListInsert 函数中信号量的 for 循环中

java - Java中的静态绑定(bind)和动态绑定(bind)

java - JSP 编译器在使用 "+"运算符时显示错误

java - Jhipster实体生成错误

ios - 在 Swift 3 中永远调度时间

java - 如何将传感器数据从作为服务器的arduino发送到tomcat上的jsp?

C++ 信号量(读/写)

operating-system - 为什么在信号量操作期间必须禁用所有中断?