1

假设我们有这样的东西,

class Class{    
//...
synchronized void m1(Class obj){ obj.m2(); }
synchronized void m2(){ /*...*/ }
}

我的问题 - 对象 obj 的锁定何时释放?当它从方法 m2 或方法 m1 返回时?

4

2 回答 2

3

来自JLS 第 17 节

一个线程 t 可能会多次锁定一个特定的监视器;每次解锁都会反转一次锁定操作的效果。

但是,您的问题很复杂,因为它m1()可能m2()会锁定不同的对象。 m1()锁定你调用它的任何对象,你没有显示。所以事件的顺序是:

  1. 您调用x.m1(y)wherex并且y可能是Class.
  2. 在进入之前m1,JVM 将监视器锁定为x.
  3. m1调用m2
  4. 在进入m2JVM 之前将监视器锁定为y.
  5. m2退出时,释放y监视器
  6. m1退出时,释放x监视器

如果xy是同一个对象,则在m1退出时释放锁。

于 2012-05-30T22:55:22.243 回答
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()

于 2012-05-30T23:03:50.567 回答