Java 中的对象同步



如果我在一个类中有一个同步的方法,那么同步只应用于该类或该方法正在修改的对象。

例如,如果我有一个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.setXC.setX之间没有任何关系,因此将有两种完全不同的同步。

实际上,在A.setX上设置同步会更有意义。

每个同步的方法或块指定或暗示某个对象。对于静态方法,它是其类的类对象。对于非静态方法,它是目标对象,其this

同步

在同一对象上同步的方法和块之间运行。同步对未同步的代码或在不同对象上同步的代码没有影响。

同步的方法只会与在同一 B 实例上同步的代码同步。

最新更新