Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.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,我需要弄清楚几个基本概念,以检查我的理解是否正确 1)一旦线程在实例上输入任何同步方法,其他线程就不能在同一实例上输入任何其他同步方法 2)但是,该实例上的非同步方法将继续可调用(由其他线程调用)。如果是,那么我可以说整个对象没有被锁定,只有被同步的关键方法被锁定 3) 对于synchronized语句,我是否也会得到与上面相同的行为: synchronised(this){ // statements to be synchronised } 或者整个对象在该实例上被非同步方

我需要弄清楚几个基本概念,以检查我的理解是否正确

1)一旦线程在实例上输入任何同步方法其他线程就不能在同一实例上输入任何其他同步方法

2)但是,该实例上的非同步方法将继续可调用(由其他线程调用)。如果是,那么我可以说整个对象没有被锁定,只有被同步的关键方法被锁定

3) 对于
synchronized
语句,我是否也会得到与上面相同的行为:

synchronised(this){

     // statements to be synchronised  
}
或者整个对象在该实例上被非同步方法锁定


我想我对锁定范围很困惑

锁只会阻止其他线程获取相同的锁——锁本身不知道它保护什么——它只是一个线程可以拥有的东西。我们说整个对象被锁定是因为试图锁定整个对象的任何其他线程在释放之前都无法获取该锁。否则,您的理解是正确的。

您的陈述是正确的。只有同步的代码才会受到保护。对象只是用作同步锁,它本身并没有“锁定”

是的,对于同一对象上的同步块,可以获得相同的行为。事实上,您可以使用另一个对象作为锁来同步一个对象代码中的块。

代码

public synchronized void abc() {
...
}
它在概念上与

public void abc() {
    synchronized(this) {
    }
}

在这两种情况下,当监视器(在本例中,调用方法abc的对象)被执行同步块或方法的线程锁定时,可以调用非同步方法。

您的理解是正确的。你的三个陈述都是有效的。
但请注意,锁不在方法上(同步或非同步)。锁始终在对象上,一旦一个线程获得了对象上的锁,其他线程就必须等待锁被释放并可供其他线程获取。

您的语句“锁本身不知道它保护什么”至少对我来说值得一票。不要考虑同步方法。考虑同步对象(同步方法只是一个方法,其主体包含在隐式
synchronized(此){…}
块中)然后阅读David Schwartz写的内容(如下)。