如果我在一个类中有一个同步的方法,那么同步只应用于该类或该方法正在修改的对象。
例如,如果我有一个A类,如下所示
public class A {
private int x;
public void setX(int x) {
this.x = x;
}
}
有两个类 B 和 C 具有某种方法来设置 x 的值。喜欢
public class B implements Runnable {
private A a;
public B(A a) {
this.a = a;
}
public synchronized void setX(A a) {
int tempX = 0;
.... //Some logic to calculate tempX value
a.setX(tempX);
}
@Override
public void run() {
this.setX(a);
}
}
C 类还将具有设置x值的同步方法。
现在,如果我创建一个 A 的对象并将相同的对象传递给 B 和 C,同步是否也会发生在对象 A 上,或者我们需要同步类 A 的 setX。
注意:由于我正在学习线程,所以如果问题听起来很愚蠢,请耐心等待。我只是想了解如果调用同步方法会发生什么。
您显示的代码在 B
的实例上同步。 据推测,您的其他方法将在 C
的实例上同步。 因此,您正在查看两个单独的锁 - 这些方法根本不会相互锁定,并且您没有真正同步任何内容。
A class
传递给 setX 方法时,设置的将是这个,而不是您的私有A class
。
此外,B.setX
和C.setX
之间没有任何关系,因此将有两种完全不同的同步。
实际上,在A.setX
上设置同步会更有意义。
每个同步的方法或块指定或暗示某个对象。对于静态方法,它是其类的类对象。对于非静态方法,它是目标对象,其this
。
在同一对象上同步的方法和块之间运行。同步对未同步的代码或在不同对象上同步的代码没有影响。
同步的方法只会与在同一 B 实例上同步的代码同步。