外部类和内部类方法之间的锁定和同步?

2022-09-04 08:15:30

我的问题是,如果我有一些代码,如下所示-:

public class OuterClass{
   public class InnerClass{
          public synchronized methodA(){ /* does something */}
   }
}

现在,当多个线程想要调用内部类方法时,它们会为外部类对象或内部类对象获取锁,以及如何修改语句以便我同步对外部类对象的访问/


答案 1

当多个线程想要调用内部类方法时,它们将获取外部类对象的锁

哈哈

或内部类对象

是的。

以及如何修改语句,以便我同步对外部类对象的访问/

加:

synchronized (OuterClass.this)
{
}

在方法内部,但请注意,内部锁是在外部锁之前获取的,正如语法现在应该建议的那样。一致的锁定顺序对于防止死锁至关重要。您可能更愿意先获取外部锁,在这种情况下,您应该执行以下操作:

public void methodA()
{
    synchronized(OuterClass.this)
    {
        synchronized (this)
        {
            // ...
        }
    }
}

没有对方法本身的声明。或者,如果您想要外部锁,请执行以下操作:synchronized

public void methodA()
{
    synchronized(OuterClass.this)
    {
        // ...
    }
}

答案 2

它将使用紧闭类的,因此是内部类。您可以改用:this

public void m() {
    synchronized(OuterClass.this) {
    }
 }

推荐