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

我的问题是,如果我有一些像以下代码 – :

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

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

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

没有。

或者用于内部类对象

是。

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

加:

 synchronized (OuterClass.this) { } 

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

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

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

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

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

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

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

 public void methA() { synchronized(OuterClass.this) {`enter code here` // ... } }