java中的对象同步
如果我在一个类中有一个同步的方法,那么同步只应用于该类或该方法正在修改的对象 例如,如果我有一个a级,如下所示java中的对象同步,java,multithreading,synchronization,Java,Multithreading,Synchronization,如果我在一个类中有一个同步的方法,那么同步只应用于该类或该方法正在修改的对象 例如,如果我有一个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) { th
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
注意:因为我正在学习线程,所以如果这个问题听起来很愚蠢,请容忍我。我只是想了解如果调用了synchronized方法会发生什么。您显示的代码在
B
的实例上同步。您的其他方法可能会在C
的实例上同步。因此,您看到的是两个独立的锁-这些方法根本不会相互锁定,而且您还没有真正同步任何东西。您显示的代码在B
的实例上同步。您的其他方法可能会在C
的实例上同步。因此,您将看到两个单独的锁-这些方法根本不会相互锁定,并且您没有真正同步任何东西。当您将类
传递给setX方法时,将设置这个锁,而不是您的私有类
另外,在B.setX
和C.setX
之间没有任何关系,因此将有两个完全不同的同步
实际上,在
A.setX
上设置同步将更有意义。当您将A类
传递给setX方法时,设置的将是该类,而不是您的私有A类
另外,在B.setX
和C.setX
之间没有任何关系,因此将有两个完全不同的同步
实际上,在
A.setX上设置同步将更有意义。每个同步方法或块指定或暗示某个对象。对于静态方法,它是其类的类对象。对于非静态方法,它是目标对象,它的this
同步在同一对象上同步的方法和块之间运行。同步对非同步代码或在不同对象上同步的代码没有影响
同步方法将仅与在同一个B实例上同步的代码同步。每个同步方法或块指定或暗示某个对象。对于静态方法,它是其类的类对象。对于非静态方法,它是目标对象,它的this
同步在同一对象上同步的方法和块之间运行。同步对非同步代码或在不同对象上同步的代码没有影响
您的同步方法将只与在同一个B实例上同步的代码同步。我不认为它是的副本。我的问题是,当我调用一个同步方法时,什么都会被锁定。链接中的问题是关于可以同步的对象类型。我不认为它是的副本。我的问题是,当我调用一个同步方法时,什么都会被锁定。链接中的问题是关于可以同步的对象类型。这意味着在现实世界中,我们必须同步所有可以修改对象状态的公共方法。不,实际上不是。如果状态是以原子方式修改的,那么就没有什么需要同步的。这意味着在现实世界中,我们必须同步所有可以修改对象状态的公共方法。不,实际上不是。如果状态是以原子的方式修改的,那么就没有什么需要同步的了。