【发布时间】:2012-06-05 05:02:20
【问题描述】:
假设我们有这样的东西,
class Class{
//...
synchronized void m1(Class obj){ obj.m2(); }
synchronized void m2(){ /*...*/ }
}
我的问题 - 对象 obj 的锁定何时释放?当它从方法 m2 或方法 m1 返回时?
【问题讨论】:
标签: java methods nested synchronized locks
假设我们有这样的东西,
class Class{
//...
synchronized void m1(Class obj){ obj.m2(); }
synchronized void m2(){ /*...*/ }
}
我的问题 - 对象 obj 的锁定何时释放?当它从方法 m2 或方法 m1 返回时?
【问题讨论】:
标签: java methods nested synchronized locks
一个线程可能会多次锁定一个特定的监视器;每次解锁都会反转一次锁定操作的效果。
但是,m1() 和 m2() 可能会锁定不同的对象,这使您的问题变得复杂。 m1() 锁定你调用它的任何对象,你没有显示。所以事件的顺序是:
x.m1(y),其中x 和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() 都完成。
【讨论】: