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)。