我完全没有理由认为这不是每次通话的选择。信号量可能会在不同的代码路径中被丢弃(主要检查进度/工作人员从队列中抓取工作......)具有不同的公平性要求。也许在一种情况下,我们想要公平地检查进度,而在另一种情况下,如果只有正在运行的工作人员的工作,优化L1缓存命中等,我们希望相同的少数工作人员工作。)
答案 0 :(得分:0)
tryAcquire
设置为true, fair
也是不公平的。
即使已将此信号量设置为使用公平订购政策,a 致电
tryAcquire()
会立即获得许可证 是否可用,无论其他线程当前是否正在等待。这个 尽管如此,“闯入”行为在某些情况下仍然有用 它打破了公平。如果你想尊重公平性,那么 使用tryAcquire(long, TimeUnit) tryAcquire(0, TimeUnit.SECONDS)
这几乎是等价的(它也会检测到中断)。
- https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html#tryAcquire()
我认为这种行为足以启用您概述的方案(检查进度与抓取工作)。