【发布时间】:2019-01-25 17:44:05
【问题描述】:
一位开发人员与我争论说,如果我们从另一个对象A 中的同步方法调用对象B 中的同步方法,则获取对象B 上的对象锁定没有额外成本,因为我们已经锁定了对象A。我该如何反驳?
开发者理论- “当您调用同步方法时,线程会获取该方法中使用的所有对象的锁定。”
class ObjectA {
public synchronized void methodA() {
methodB();
// do something else
}
}
class ObjectB {
public synchronized void methodB() {
// do something
}
}
【问题讨论】:
-
lock on all objects used in that method这显然是错误的。如果methodA 中的代码正在执行但不在methodB 中,则任何线程都可以成功调用并获取methodB 的锁。应该能够编写代码来证明这一点。 -
有时获取监视器 (
synchronized) 锁所需的时间较短,例如一段时间后再次获取相同的锁。我不认为它会减少到“没有时间”,但这是不可行的。它可能会减少到实际上可能发生的“实际上没有时间”。 -
我可以轻松地让其他线程锁定 objectB,但我的开发伙伴会继续毫无根据地争论。我想要明确的证据,我正在寻找在执行代码时打印指令集的方法。你有关于如何做到这一点的任何参考资料吗?
-
continue to argue baselessly这是人事问题,没有什么可以通过讨论解决的。在反模式列表中查找“Corn Cob”。 -
有很多例子展示了死锁。这应该是证据。
标签: java synchronization