首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Java的信号量公平性是构造函数的参数,而不是acquire() / tryAcquire()调用?

为什么Java的信号量公平性是构造函数的参数,而不是acquire() / tryAcquire()调用?
EN

Stack Overflow用户
提问于 2015-06-06 03:17:52
回答 1查看 268关注 0票数 3

我完全看不出为什么这不是一个每次调用的选项。信号量可能会在不同的代码路径中被关闭(主进程检查/工作进程从队列中抓取/ ...)具有不同的公平性要求。也许在一种情况下,我们希望公平地检查进度,而在另一种情况下,我们希望相同的少数工作人员工作,如果只有运行的工作人员有足够的工作,以优化L1缓存命中等。)

EN

回答 1

Stack Overflow用户

发布于 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()

我认为这个行为将足以支持您概述的场景(检查进度与抓取工作)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30674188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档