0

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

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

4

2 回答 2

0

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

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 关系。

于 2013-10-02T15:14:41.823 回答
0

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

于 2013-10-02T12:47:51.960 回答