【问题标题】:Happen before relationship to avaid deadlock发生在关系之前以避免僵局
【发布时间】:2013-10-02 12:26:16
【问题描述】:

在我读到的一些文章中,如果在 Java 中的多线程程序中维护关系之前发生,则不会出现数据竞争。但我怀疑它是否也有助于防止死锁情况?

我觉得它可能会有所帮助,但无法以适当的方式解释。任何人都可以根据发生前的关系来解释死锁吗?

【问题讨论】:

    标签: java multithreading java-memory-model


    【解决方案1】:

    happens-before 关系 (HBR) 与死锁关系不大。 HBR 是正确实现同步原语所必需的。避免死锁是关于正确使用同步原语。如果原语实现不正确,即使正确使用也会导致系统挂起,看起来好像发生了死锁——这是我能想象的 HBR 和死锁最接近的关系。

    【讨论】:

      【解决方案2】:

      此代码已正确同步且没有数据争用:

      public void transfer(Account from, Account to, Amount amount) {
          synchronized(from) {
              synchronized(to) {
                  from.debit(amount);
                  to.credit(amount);
              }
          }
      }
      

      但是如果同时调用transfer(accountA, accountB);transfer(accountB, accountA); 很容易死锁。

      synchronized 碰巧创建了 hb 关系,但这并不能决定代码是否应该死锁。

      例如,您可以使用 Lock 对象实现非常相似的东西,并避免使用 tryLock 的死锁,同时保持与上面示例中完全相同的 hb 关系。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-06
        • 1970-01-01
        • 2017-07-31
        • 1970-01-01
        • 2019-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多