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

时间:2013-09-20 07:03:52

标签: java multithreading concurrency

我的问题是我是否有类似以下的代码 - :

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

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

3 个答案:

答案 0 :(得分:18)

  

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

没有

  

或内部类对象

  

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

的访问

添加:

synchronized (OuterClass.this)
{
}

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

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

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

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

答案 1 :(得分:4)

它将使用紧邻的类的this作为内部类。您可以改为使用:

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

答案 2 :(得分:-1)

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

public void methA()
{

synchronized(OuterClass.this)

{`enter code here`
        // ...
    }
}