以下方法是SomeType
类的方法 - 它用作其参数的类型。 行注释表示行#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'可以在*'a'进入第3行的块之前进入'someMethod()'*。每个线程都拥有顶级监视器并且处于死锁状态。 – chrylis 2015-04-05 20:54:22
当然,看起来像是一个僵局。我见过的常用方法是始终以明确的顺序获取互斥锁。 – chrylis 2015-04-05 20:54:57
@chrylis好的,我的错。 – 2015-04-05 20:56:03