【问题标题】:A lock that refuses same-thread reentrant but allows different thread reentrant拒绝同线程重入但允许不同线程重入的锁
【发布时间】:2015-11-11 13:11:14
【问题描述】:

是否存在满足以下规则的锁或其他同步原语:

  • 锁具有无限许可,
  • 任何单个线程最多只能获得一个许可,
  • 没有许可的线程总是可以立即获得许可,
  • 当一个线程被拒绝许可时(它已经拥有一个),它应该返回一个 boolean 而不是阻塞(duh)。

我知道我可以自己使用AbstractQueuedSynchronizer 构建它,但我从来没有玩过这个,目前我只需要一个开箱即用的无错误解决方案。 (我很好奇它是否存在)

还有一件事:

  • 除了添加一两个额外的类之外,不允许使用任何库

【问题讨论】:

  • 我认为使用“ThreadLocal”对象作为标志变量可以解决您的问题。
  • 这如何构成锁?它似乎永远不会阻塞。
  • @Porcelain 是对的,这就像一个线程缓存,也许 ThreadLocal<OnceCalculatedResult> 适合。 Porcelan 意味着在你的受保护的工作中设置一个布尔值并在下次检查它。
  • 正如其他人所指出的,执行此操作不需要其他线程的知识。但是您也不应该需要 ThraLocal。如果你不能用一个简单的布尔字段来做到这一点,那么你的程序可能设计得很糟糕。

标签: java concurrency java.util.concurrent


【解决方案1】:

您所描述的不是任何类型的同步工具,它恰恰相反:防止线程之间的任何干扰。您的工具具有单线程语义,该语义必须不受使用它的线程数的影响。

因此,正如 cmets 中所建议的,ThreadLocal<Boolean> 似乎是它的完美匹配。

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    相关资源
    最近更新 更多