在我读到的一些文章中,如果在 Java 的多线程程序中维护关系之前发生,则不会出现数据竞争。但我怀疑它是否也有助于防止死锁情况?
我觉得它可能会有所帮助,但无法以适当的方式解释。任何人都可以用发生之前的关系来解释僵局吗?
在我读到的一些文章中,如果在 Java 的多线程程序中维护关系之前发生,则不会出现数据竞争。但我怀疑它是否也有助于防止死锁情况?
我觉得它可能会有所帮助,但无法以适当的方式解释。任何人都可以用发生之前的关系来解释僵局吗?
此代码已正确同步并且没有数据竞争:
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 关系。
发生之前的关系(HBR)与死锁几乎没有关系。HBR 是正确实现同步原语所必需的。避免死锁是关于正确使用同步原语。如果原语实现不正确,即使正确使用也会导致系统挂起,看起来好像发生了死锁——这是我能想象的 HBR 和死锁最接近的关系。