假设我们有这样的东西,
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调用m2m2JVM 之前将监视器锁定为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()。