在一些文章中,我读过如果在java中的多线程程序中维护关系之前发生,则不会出现数据竞争的可能性。但我怀疑它是否也有助于防止死锁情况呢?
我觉得这可能会有所帮助,但无法以正确的方式解释。任何人都可以解释发生在关系之前的僵局吗?
答案 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关系。