【发布时间】:2015-04-05 20:46:01
【问题描述】:
下面的方法是SomeType 类的方法——它作为参数的类型。
行 cmets 表示行 #s。
synchronized void someMethod(SomeType other) { // line 1
// line 2
synchronized (other) { // line 3
//...do stuff // line 4
}
}
表示为“第 4 行”的块调用了 this 的其他一些同步方法
和other,此代码旨在避免死锁。
但是——假设a.someMethod(b) 和b.someMethod(a) 被同时调用,其中a 和b 是不同的实例。
进一步假设b.someMethod(a) 在a.someMethod(b) 之后被调用,并且它们都被阻止
在第 2 行——a 和 b 中的每一个都获得了自己的锁并等待对方的锁继续进行。
这可以/不会发生吗?
如果是这样 - 在哪些 jdk 实现上?这看起来取决于具体的实现,除非它 明确在 jdk 规范中。
TIA
【问题讨论】:
-
但是
b可以进入someMethod()beforea进入第3行的block,每个线程都持有顶级monitor,死锁了。 -
在我看来确实是个僵局。我见过的常用方法是始终以明确定义的顺序获取互斥锁。
-
@chrylis 当然,我的错。
标签: java multithreading concurrency deadlock synchronized