13

我的问题是我是否有如下代码:

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

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

4

3 回答 3

20

当多个线程要调用内部类方法时,它们是否会为外部类对象获取锁

不。

或者对于内部类对象

是的。

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

添加:

synchronized (OuterClass.this)
{
}

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

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

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

public void methodA()
{
    synchronized(OuterClass.this)
    {
        // ...
    }
}
于 2013-09-20T07:08:33.133 回答
4

它将使用this直接封闭类的内部类。您可以改用:

public void m() {
    synchronized(OuterClass.this) {
    }
 }
于 2013-09-20T07:09:49.797 回答
-1

由于您已将内部类方法设置为同步,因此它不会锁定外部类对象,而只会锁定内部类方法。如前所述,要同步外部类,可以如下所示完成

public void methA()
{

synchronized(OuterClass.this)

{`enter code here`
        // ...
    }
}
于 2017-09-07T16:52:08.730 回答