Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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 - Fatal编程技术网

在Java中,当对象中的一个方法是“同步的”时,所有方法都是“同步的”吗?

在Java中,当对象中的一个方法是“同步的”时,所有方法都是“同步的”吗?,java,multithreading,Java,Multithreading,我的理解是,当一个对象方法被“同步”时,那么该方法一次只允许一个线程。我测试了一下,它成功了 但是最近我被告知线程必须获得控制才能访问同步方法的锁是对象锁。这意味着对象的所有方法都已同步或未以同步方式有效地运行 我用同步的void方法1测试了这一点;无效方法2;而且似乎许多线程能够同时进入method2 这个家伙所指的对象锁是什么?它是如何工作的?他的意思是,如果有两个同步的方法,它们将在彼此之间同步,而不仅仅是单独同步。这是因为在调用该方法的实例上持有对象锁 换句话说,如果您有两个同步的方法f

我的理解是,当一个对象方法被“同步”时,那么该方法一次只允许一个线程。我测试了一下,它成功了

但是最近我被告知线程必须获得控制才能访问同步方法的锁是对象锁。这意味着对象的所有方法都已同步或未以同步方式有效地运行

我用同步的void方法1测试了这一点;无效方法2;而且似乎许多线程能够同时进入method2


这个家伙所指的对象锁是什么?它是如何工作的?

他的意思是,如果有两个同步的方法,它们将在彼此之间同步,而不仅仅是单独同步。这是因为在调用该方法的实例上持有对象锁

换句话说,如果您有两个同步的方法foo和bar,那么当另一个线程正在调用foo时,没有线程可以调用bar

如果你写出定义,这很容易看出。同步方法

public synchronized void foo() { 
  stuff;
}
相当于:

public void foo() { 
  synchronized(this) {
    stuff;
  }
}

对于没有关联实例的方法,即静态方法,类实例上会有一个锁。

他的意思是,如果有两个同步的方法,它们将在彼此之间同步,而不仅仅是单独同步。这是因为在调用该方法的实例上持有对象锁

换句话说,如果您有两个同步的方法foo和bar,那么当另一个线程正在调用foo时,没有线程可以调用bar

如果你写出定义,这很容易看出。同步方法

public synchronized void foo() { 
  stuff;
}
相当于:

public void foo() { 
  synchronized(this) {
    stuff;
  }
}

对于没有关联实例的方法,即静态方法,类实例上会有一个锁。

因此,如果在同一对象上有两个同步方法,则只能同时运行一次,而不是每次运行一次。因此,如果在同一对象上有两个同步方法,同一时间只能跑一次,而不是每次都跑一次。你说得对。本例中未同步method2。您是对的。本例中未同步method2。