说我们有类似的东西,
class Class{
//...
synchronized void m1(Class obj){ obj.m2(); }
synchronized void m2(){ /*...*/ }
}
我的问题 - 什么时候锁定对象obj?当它从方法m2返回时,或方法m1?
答案 0 :(得分:3)
线程t可能会多次锁定特定监视器;每次解锁都会逆转一次锁定操作的效果。
但是,由于m1()
和m2()
可能会锁定不同的对象,因此您的问题很复杂。 m1()
会锁定您调用它的任何对象,而这些对象尚未显示。所以事件的顺序是:
x.m1(y)
x
和y
可能是Class
的不同实例。m1
之前,JVM会将监视器锁定为x
。m1
调用m2
m2
之前,JVM将监视器锁定为y
。m2
时,y
的监视器已发布m1
时,x
的监视器已发布如果x
和y
是同一个对象,则会在m1
退出时释放锁定。
答案 1 :(得分:1)
尝试翻译同步块中的synchronized
方法:
m1(C obj) {
synchronized(this) {
obj.m2();
}
}
m2() {
synchronized(this) {
// some stuff
}
}
因此,您的obj
对象仅在m2()
来电期间被锁定。这是因为这是this
转换为obj
的唯一时间。
m1()
调用仅锁定当前对象,顺便说一下,该对象也可以是obj
;如果是这种情况(第一次调用中为this == obj
),那么obj
将被锁定,直到m1()
和m2()
完成。