Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的对象同步_Java_Multithreading_Synchronization - Fatal编程技术网

java中的对象同步

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

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

例如,如果我有一个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


注意:因为我正在学习线程,所以如果这个问题听起来很愚蠢,请容忍我。我只是想了解如果调用了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实例上同步的代码同步。

我不认为它是的副本。我的问题是,当我调用一个同步方法时,什么都会被锁定。链接中的问题是关于可以同步的对象类型。我不认为它是的副本。我的问题是,当我调用一个同步方法时,什么都会被锁定。链接中的问题是关于可以同步的对象类型。这意味着在现实世界中,我们必须同步所有可以修改对象状态的公共方法。不,实际上不是。如果状态是以原子方式修改的,那么就没有什么需要同步的。这意味着在现实世界中,我们必须同步所有可以修改对象状态的公共方法。不,实际上不是。如果状态是以原子的方式修改的,那么就没有什么需要同步的了。