【发布时间】:2015-11-11 13:11:14
【问题描述】:
是否存在满足以下规则的锁或其他同步原语:
- 锁具有无限许可,
- 任何单个线程最多只能获得一个许可,
- 没有许可的线程总是可以立即获得许可,
- 当一个线程被拒绝许可时(即它已经拥有一个),它应该返回一个
boolean而不是阻塞(duh)。
我知道我可以自己使用AbstractQueuedSynchronizer 构建它,但我从来没有玩过这个,目前我只需要一个开箱即用的无错误解决方案。 (我很好奇它是否存在)
还有一件事:
- 除了添加一两个额外的类之外,不允许使用任何库
【问题讨论】:
-
我认为使用“ThreadLocal”对象作为标志变量可以解决您的问题。
-
这如何构成锁?它似乎永远不会阻塞。
-
@Porcelain 是对的,这就像一个线程缓存,也许
ThreadLocal<OnceCalculatedResult>适合。 Porcelan 意味着在你的受保护的工作中设置一个布尔值并在下次检查它。 -
正如其他人所指出的,执行此操作不需要其他线程的知识。但是您也不应该需要 ThraLocal。如果你不能用一个简单的布尔字段来做到这一点,那么你的程序可能设计得很糟糕。
标签: java concurrency java.util.concurrent