我绝对没有理由说这不是按通话选项。信号量可能会以不同的公平性要求在不同的代码路径(主检查进度/工作人员从队列中抓取工作...)中删除。也许在一种情况下,我们希望公平地检查进度,而在另一种情况下,如果只有正在运行的工作人员有足够的工作来优化L1缓存命中率等,我们希望同样的少数工作人员可以工作)

最佳答案

即使在构造函数中将tryAcquire设置为true,fair也是不公平的。

即使将此信号量设置为使用公平的排序策略,
调用tryAcquire()将立即获得许可,如果
是否可用,无论其他线程当前是否在等待。这个
即使在某些情况下,“闯入”行为也可能有用
它破坏了公平。如果您想遵守公平设置,那么
使用tryAcquire(long, TimeUnit) tryAcquire(0, TimeUnit.SECONDS) 这几乎是等效的(它也可以检测到中断)。

-https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html#tryAcquire()

我认为这种行为足以启用您概述的方案(检查进度还是抓取工作)。

关于java - 为什么Java的Semaphore公平性是构造函数的参数,而不是acquire()/tryAcquire()调用的参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30674188/

10-10 11:24