假设我们有这样的东西,
class Class{
//...
synchronized void m1(Class obj){ obj.m2(); }
synchronized void m2(){ /*...*/ }
}
我的问题 - 什么时候释放对象 obj 的锁?当它从方法 m2 或方法 m1 返回时?
最佳答案
A thread t may lock a particular monitor multiple times; each unlock reverses the effect of one lock operation.
但是,由于 m1()
和 m2()
可能锁定不同 对象,您的问题变得复杂了。 m1()
锁定您调用它的任何对象,您尚未显示。所以事件的顺序是:
- 您调用
x.m1(y)
,其中x
和y
可能是Class
的不同实例。 - 在进入
m1
之前,JVM 锁定x
的监视器。 m1
调用m2
- 在进入
m2
之前,JVM 会为y
锁定监视器。 - 当
m2
退出时,释放y
的监视器 - 当
m1
退出时,释放x
的监视器
如果x
和y
是同一个对象,那么在m1
退出时释放锁。
关于java - 锁和嵌套的同步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10825124/