【问题标题】:locks and nested synchronized methods锁和嵌套同步方法
【发布时间】: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


    【解决方案1】:

    来自JLS Section 17

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

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

    1. 您调用x.m1(y),其中xy 可能是Class 的不同实例。
    2. 在输入m1 之前,JVM 会锁定x 的监视器。
    3. m1 调用 m2
    4. 在输入m2 之前,JVM 会锁定y 的监视器。
    5. m2 退出时,y 的监视器被释放
    6. m1 退出时,x 的监视器被释放

    如果xy是同一个对象,那么当m1退出时,锁就会被释放。

    【讨论】:

      【解决方案2】:

      尝试翻译同步块中的synchronized 方法:

      m1(C obj) {
          synchronized(this) {
              obj.m2();
          }
      }
      
      m2() {
          synchronized(this) {
              // some stuff
          }
      }
      

      所以您的obj 对象仅在m2() 调用期间被锁定。这是因为这是 this 转换为 obj 的唯一时间。

      m1() 调用只锁定当前对象,顺便说一下,它也可以是相同的obj;如果是这种情况(第一次调用中的this == obj),那么obj 将被锁定,直到m1()m2() 都完成。

      【讨论】:

      • 我问是因为我想我在某处看到当我们从内部方法返回时不应该释放锁。但是,现在我想他们想到了同一个“这个”对象,因为我相信你:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多