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_Java Threads - Fatal编程技术网

Java 我可以调用一个同步的方法来调用一个非同步的方法来调用一个同步的方法吗?

Java 我可以调用一个同步的方法来调用一个非同步的方法来调用一个同步的方法吗?,java,multithreading,synchronization,java-threads,Java,Multithreading,Synchronization,Java Threads,在Java中,在单个对象和线程中使用synchronized关键字all 我是否可以调用一个同步方法,该方法调用一个非同步方法,该方法调用一个同步方法,而不阻止第一个同步方法的完成?对于单个对象和单个线程,没有问题 您唯一的线程能够获取所有锁,并且由于可重入性,它可以多次获取它们 即使我们添加了另一个线程,它也可以工作(使用一个对象)。一个线程将获得第一个锁,阻塞第二个线程,执行将正常继续 对于多线程和多个对象,答案是“这取决于代码的编写方式”。对于单个对象和单个线程,没有问题 您唯一的线程能够

在Java中,在单个对象和线程中使用synchronized关键字all


我是否可以调用一个同步方法,该方法调用一个非同步方法,该方法调用一个同步方法,而不阻止第一个同步方法的完成?

对于单个对象和单个线程,没有问题

您唯一的线程能够获取所有锁,并且由于可重入性,它可以多次获取它们

即使我们添加了另一个线程,它也可以工作(使用一个对象)。一个线程将获得第一个锁,阻塞第二个线程,执行将正常继续


对于多线程和多个对象,答案是“这取决于代码的编写方式”。对于单个对象和单个线程,没有问题

您唯一的线程能够获取所有锁,并且由于可重入性,它可以多次获取它们

即使我们添加了另一个线程,它也可以工作(使用一个对象)。一个线程将获得第一个锁,阻塞第二个线程,执行将正常继续


对于多线程和多个对象,答案是“这取决于代码的编写方式”。

如果一个类同时具有同步和非同步方法,则多个 线程仍然可以访问类的非同步方法 方法如果不访问您试图保护的数据,那么您就不会访问 需要同步它们。在某些情况下,同步可能会导致命中(或
即使死锁(如果使用不正确)

如果一个类同时具有同步和非同步方法,则 线程仍然可以访问类的非同步方法 方法如果不访问您试图保护的数据,那么您就不会访问 需要同步它们。在某些情况下,同步可能会导致命中(或
即使死锁(如果使用不正确)

无论方法是否同步,您的代码始终可以调用该方法。更好的问题是,当代码调用它时会发生什么

一个如下所示的同步方法:

synchronized void foobar() {
    doSomething();
}
实际上,这只是一种简单的书写方式:

void foobar() {
    synchronized(this) {
        doSomething();
    }
}
因此,任何关于调用同步方法的问题实际上都是关于执行同步块的问题。当代码进入
synchronized(this){…}
时,可能会发生三件事

1) 如果
this
对象未被锁定,那么它将以调用线程的名称被锁定,线程将执行块中的语句,然后在完成时解锁锁

2) 如果
this
对象已经被调用线程锁定,那么线程将只执行块中的语句

3) 如果
这个
对象被其他线程锁定,那么调用线程将等待,直到其他线程解锁它,然后它将继续进行,如案例(1)所示


如果代码试图锁定两个不同的锁,那么您就会陷入麻烦。然后,如果您的设计没有经过深思熟虑,两个或多个线程可能会死锁,这一点您可以在其他地方了解。

无论方法是否同步,您的代码都可以调用该方法。更好的问题是,当代码调用它时会发生什么

一个如下所示的同步方法:

synchronized void foobar() {
    doSomething();
}
实际上,这只是一种简单的书写方式:

void foobar() {
    synchronized(this) {
        doSomething();
    }
}
因此,任何关于调用同步方法的问题实际上都是关于执行同步块的问题。当代码进入
synchronized(this){…}
时,可能会发生三件事

1) 如果
this
对象未被锁定,那么它将以调用线程的名称被锁定,线程将执行块中的语句,然后在完成时解锁锁

2) 如果
this
对象已经被调用线程锁定,那么线程将只执行块中的语句

3) 如果
这个
对象被其他线程锁定,那么调用线程将等待,直到其他线程解锁它,然后它将继续进行,如案例(1)所示


如果代码试图锁定两个不同的锁,那么您就会陷入麻烦。然后,如果您的设计没有经过深思熟虑,两个或多个线程可能会死锁,这是您可以在其他地方了解到的。

尝试一下……但据我所知,答案是否定的。好吧,我们可以,但死锁的可能性很大。答案是:这取决于同步的组织方式和每个监视器的状态。如果你有一个监视器(锁)并且只有一个线程,那么它应该不会有问题,因为Java中的锁是可重入的(线程可以进入它已经拥有的锁上的同步块中不止一次-它只会增加该线程的监视器计数器)。试试看……但答案就我所知是否定的,但很有可能会死锁。答案是:这取决于同步的组织方式和每个监视器的状态。如果您只有一个监视器(锁)和一个线程,那么它应该不会有问题,因为Java中的锁是可重入的(线程可以多次进入它已经拥有的锁上的同步块-它只会增加该线程监视器的计数器)。