在关系之前发生以避免死锁

时间:2013-10-02 12:26:16

标签: java multithreading java-memory-model

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

我觉得这可能会有所帮助,但无法以正确的方式解释。任何人都可以解释发生在关系之前的僵局吗?

2 个答案:

答案 0 :(得分:0)

发生 - 之前关系(HBR)与死锁没什么关系。 HBR需要正确实现同步原语。死锁避免是关于同步原​​语的正确使用。如果原语被错误地实现,即使正确的使用也会导致系统挂起,这看起来好像发生了死锁 - 这是我能想象的最接近的HBR和死锁关系。

答案 1 :(得分: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关系。