假设我们有这样的东西,
class Class{
//...
synchronized void m1(Class obj){ obj.m2(); }
synchronized void m2(){ /*...*/ }
}
我的问题 - 对象 obj 的锁定何时释放?当它从方法 m2 或方法 m1 返回时?
假设我们有这样的东西,
class Class{
//...
synchronized void m1(Class obj){ obj.m2(); }
synchronized void m2(){ /*...*/ }
}
我的问题 - 对象 obj 的锁定何时释放?当它从方法 m2 或方法 m1 返回时?
一个线程 t 可能会多次锁定一个特定的监视器;每次解锁都会反转一次锁定操作的效果。
但是,您的问题很复杂,因为它m1()
可能m2()
会锁定不同的对象。 m1()
锁定你调用它的任何对象,你没有显示。所以事件的顺序是:
x.m1(y)
wherex
并且y
可能是Class
.m1
,JVM 将监视器锁定为x
.m1
调用m2
m2
JVM 之前将监视器锁定为y
.m2
退出时,释放y
监视器m1
退出时,释放x
监视器如果x
和y
是同一个对象,则在m1
退出时释放锁。
尝试翻译synchronized
同步块中的方法:
m1(C obj) {
synchronized(this) {
obj.m2();
}
}
m2() {
synchronized(this) {
// some stuff
}
}
因此,您的obj
对象仅在m2()
通话期间被锁定。这是因为这是唯一一次this
转换为obj
.
该m1()
调用仅锁定当前对象,顺便说一下,它也可以是相同的obj
;如果是这种情况(this == obj
在第一次调用中),obj
则被锁定直到两者都m1()
完成m2()
。