我有一个外部类A,它有一个公共内部类,结构如下 - :
public class A{
public int x;
public class B{
private static final int y;
}
public synchronized int method1(){
return x+ B.y;
}
}
问题是,如果我在类A的每个方法上使用了synchronized关键字,它是否也会锁定内部类的成员?
答案 0 :(得分:1)
如果我在A类的每个方法上都使用了synchronized关键字,那么它也会锁定内部类的成员吗?
不,不会。
你似乎在很多方面感到困惑。
使用原始互斥锁(例如,通过synchronized
方法)仅锁定在同一互斥锁上同步的其他线程。
调用同步实例方法时,您获取的互斥锁是this
...目标对象的互斥锁。
在您的示例中,您似乎想要锁定static
字段,而不是实例字段。
如果我理解你正在尝试做什么,正确的方法就是这样:
public synchronized int method1(){
synchronized (B.class) {
return x + B.y;
}
}
请注意,这涉及获取两个互斥锁,因此您需要确保代码始终以相同的顺序获取它们。 (如果不这样做,则存在死锁风险。)
如果您在B
上创建并调用同步静态方法以获取y
字段的值,则会获得相同的效果。
答案 1 :(得分:0)
不,内部类和外部类是两个不同的类对象,它们不会相同。我建议在外部类中创建一个字段来手动同步。
答案 2 :(得分:0)
在2个对象上使用单个互斥锁的示例。两个对象都可以更改变量x。
public class A { private Object mutex = new Object(); private int x; private B b = new B(); public class B { private int y; public int method() { synchronized(mutex) { return x++; } } } public int method() { synchronized(mutex) { return x += b.y; } } }