我完全看不出为什么这不是一个每次调用的选项。信号量可能会在不同的代码路径中被关闭(主进程检查/工作进程从队列中抓取/ ...)具有不同的公平性要求。也许在一种情况下,我们希望公平地检查进度,而在另一种情况下,我们希望相同的少数工作人员工作,如果只有运行的工作人员有足够的工作,以优化L1缓存命中等。)
发布于 2015-06-06 03:35:07
即使在构造函数中将fair设置为true,tryAcquire也是不公平的。
即使将此信号量设置为使用公平排序策略,如果有可用的许可证,则对
tryAcquire()的调用将立即获得许可证,而不管其他线程当前是否正在等待。这种“插入”行为在某些情况下可能是有用的,即使它破坏了公平性。如果您想遵守公平性设置,那么使用几乎等效的tryAcquire(long, TimeUnit) tryAcquire(0, TimeUnit.SECONDS)(它还可以检测中断)。
-- https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html#tryAcquire()
我认为这个行为将足以支持您概述的场景(检查进度与抓取工作)。
https://stackoverflow.com/questions/30674188
复制相似问题