【发布时间】:2011-10-20 11:43:18
【问题描述】:
类似于问题I posted yesterday,我有这个问题,我就是无法理解。代码非常简单,应该(我认为)产生死锁。我什至将账户数量减少到 2 个,以增加死锁的概率。
代码真的很容易理解,但要加上一些上下文。我有一家有账户的银行,我在账户之间进行了大量转账。转移方法应该会产生死锁。为什么没有发生这种情况?
我只能认为代码运行得太快了,但这似乎不太可能一直发生。
这是整个代码: http://pastebin.com/HWJpuT38
【问题讨论】:
-
为什么你的代码会产生死锁?
-
最简单的解决方案是对 Bank 对象进行全局锁定。由于与您要保护的操作相比,锁定相对昂贵,因此这可能会更快。
-
尝试在您的同步语句之间放置一个线程睡眠以尝试强制解决问题。 "synchronized(fromAccount) { Thread.sleep(100); synchronized(toAccount) {"
-
想象 2 次传输,从 1 到 2 和 2 到 1。可能会发生第一个线程在 1 上获得锁,然后第二个线程在 2 上获得锁。那么它们都将是等待对方释放锁,不会发生,死锁。
标签: java concurrency synchronized