Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.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_Locking - Fatal编程技术网

Java 在下面的多线程场景中会发生什么?

Java 在下面的多线程场景中会发生什么?,java,multithreading,synchronization,locking,Java,Multithreading,Synchronization,Locking,假设我有一个类,其中的方法按如下方式同步 public class Test{ public static synchronized void method1(){ } public static synchronized void method2(){ } public synchronized void method3(){ } public synchronized void method4(){ } } 因此,有一种情况是

假设我有一个类,其中的方法按如下方式同步

public class Test{
    public static synchronized void method1(){
    }
    public static synchronized void method2(){
    }
    public synchronized void method3(){
    }
    public synchronized void method4(){
    }
}
因此,有一种情况是两个线程同时调用
method1
method2
。我觉得只允许调用其中一个方法。如果它们调用
method1
method3
会发生什么情况。这里也会有同样的情况吗?method3和
会发生什么情况
method4
来自同一对象

所以有一个场景是两个线程调用method1和method1 方法2同时进行。我觉得只有一种方法是允许的 召唤

这对我来说毫无意义


一个线程一次只能调用一个方法。另一方面,一个方法可以被多个线程调用。

通过在静态方法上使用synchronized,您将在类对象上同步。因此,基本上只能从不同线程运行一个同步方法。无法获取锁的方法将等待第一个方法完成

普通方法在实例上执行同步。因此,静态方法和非静态方法可以由不同的线程同时运行。如果从不同线程调用一个方法,则两个不同的非静态同步方法不会同时运行。一个方法将等待第一个方法完成

因此:

如果从不同的线程调用method1和method2,则它们不会同时运行

如果从不同的线程调用method3和method4,则它们不会同时运行


如果从不同的线程调用method1和method3(对于method2和Method4相同)

如果有两个类Test对象,由x和y引用,则将有三个监视器,一个用于测试,一个用于x,一个用于y


方法1和方法2都使用测试监视器,因此相互排除。method3和method4都将监视器用于其目标对象,因此,如果为同一对象调用,它们会相互排除,但如果为不同对象调用,则不会相互排除。它们不涉及测试监视器,因此不排除静态方法。

尝试调用同步静态和非静态方法的线程永远不会相互阻塞

调用
method1
method2
的线程将锁定在
Test.class
上,而对于
method3
method4
它将锁定在
this


因此,调用
method1
method3
的线程不会互相阻塞,而调用
method3
method4
的线程如果使用相同的
Test
实例,则会互相阻塞。您可以尝试一下。。如果您同时从两个不同的位置调用同步方法,两个调用都将依次完成(afaik)。