【发布时间】:2013-10-02 12:26:16
【问题描述】:
在我读到的一些文章中,如果在 Java 中的多线程程序中维护关系之前发生,则不会出现数据竞争。但我怀疑它是否也有助于防止死锁情况?
我觉得它可能会有所帮助,但无法以适当的方式解释。任何人都可以根据发生前的关系来解释死锁吗?
【问题讨论】:
标签: java multithreading java-memory-model
在我读到的一些文章中,如果在 Java 中的多线程程序中维护关系之前发生,则不会出现数据竞争。但我怀疑它是否也有助于防止死锁情况?
我觉得它可能会有所帮助,但无法以适当的方式解释。任何人都可以根据发生前的关系来解释死锁吗?
【问题讨论】:
标签: java multithreading java-memory-model
happens-before 关系 (HBR) 与死锁关系不大。 HBR 是正确实现同步原语所必需的。避免死锁是关于正确使用同步原语。如果原语实现不正确,即使正确使用也会导致系统挂起,看起来好像发生了死锁——这是我能想象的 HBR 和死锁最接近的关系。
【讨论】:
此代码已正确同步且没有数据争用:
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 关系。
【讨论】: