假设我有一个类,其中has方法以如下方式同步。
public class Test{
public static synchronized void method1(){
}
public static synchronized void method2(){
}
public synchronized void method3(){
}
public synchronized void method4(){
}
}
因此有两个线程同时调用method1
和method2
的情况。我觉得只允许其中一个方法调用。如果他们调用{{1}将会出现这种情况这里也会出现相同的情况吗?来自同一个对象的method1
和method3
会出现什么情况?
答案 0 :(得分:5)
如果有两个Test类对象,由x和y引用,则会有三个监视器,一个用于Test,一个用于x,一个用于y。
method1和method2都使用Test监视器,因此相互排斥。 method3和method4每个都使用监视器作为其目标对象,因此如果调用同一个对象,它们会相互排斥,但如果调用不同的对象则不会。它们不涉及Test监视器,因此它们不排除静态方法。
答案 1 :(得分:0)
因此有两个线程正在调用method1和 方法2同时。我觉得只允许其中一种方法 致电
这对我没有任何意义。
单个线程一次只能调用一个方法。另一方面,多个线程可以调用单个方法。
答案 2 :(得分:0)
通过在静态方法上使用synchronized,您将在Class对象上进行同步。所以基本上只能从不同的线程运行一个同步方法。无法获取锁定的那个将等待第一个方法完成
普通方法在实例上进行同步。因此,静态方法和非静态方法可以由不同的线程一次运行。如果从不同的线程调用一个方法,则不会同时运行2个不同的非静态同步方法。一种方法将等待第一次完成
所以:
如果从不同的线程调用它们,method1和method2将不会同时运行
如果从不同的线程调用它们,method3和method4将不会同时运行
如果从不同的线程调用它们,方法1和方法3将同时运行(方法2和方法4相同)答案 3 :(得分:0)
调用OPEN cur FOR 'SELECT ... WHERE zip IN(' || A || ') AND ...';
和method1
的帖子将被锁定在method2
上,而对于Test.class
和method3
,它将被锁定在method4
上
所以调用this
和method1
的线程不会互相阻塞,而调用method3
和method3
的线程如果使用相同的实例则会相互阻塞method4
。