我的问题是我是否有如下代码:
public class OuterClass{
public class InnerClass{
public synchronized methodA(){ /* does something */}
}
}
现在,当多个线程想要调用内部类方法时,它们将为外部类对象或内部类对象获取锁,以及如何修改语句以便我同步对外部类对象的访问/
我的问题是我是否有如下代码:
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) {
}
}
由于您已将内部类方法设置为同步,因此它不会锁定外部类对象,而只会锁定内部类方法。如前所述,要同步外部类,可以如下所示完成
public void methA()
{
synchronized(OuterClass.this)
{`enter code here`
// ...
}
}