在下面的多线情景中会发生什么?

时间:2015-12-28 16:35:01

标签: java multithreading synchronization locking

假设我有一个类,其中has方法以如下方式同步。

public class Test{
    public static synchronized void method1(){
    }
    public static synchronized void method2(){
    }
    public synchronized void method3(){
    }
    public synchronized void method4(){
    }
}

因此有两个线程同时调用method1method2的情况。我觉得只允许其中一个方法调用。如果他们调用{{1}将会出现这种情况这里也会出现相同的情况吗?来自同一个对象的method1method3会出现什么情况?

4 个答案:

答案 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.classmethod3,它将被锁定在method4

所以调用thismethod1的线程不会互相阻塞,而调用method3method3的线程如果使用相同的实例则会相互阻塞method4