【问题标题】:What will happen in the following mulththreaded scenario?在以下多线程场景中会发生什么?
【发布时间】:2015-12-28 16:35:01
【问题描述】:

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

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

所以有一个场景,两个线程同时调用method1method2,感觉只允许调用其中一个方法,如果调用method1method3会是什么情况.这里也会有同样的情况吗?method3method4 来自同一个对象会是什么情况?

【问题讨论】:

标签: java multithreading synchronization locking


【解决方案1】:

如果您有两个 Test 类的对象,分别由 x 和 y 引用,则将有三个监视器,一个用于 Test,一个用于 x,一个用于 y。

method1 和 method2 都使用测试监视器,因此相互排斥。方法 3 和方法 4 各自将监视器用于它们的目标对象,因此如果为同一个对象调用它们,它们会相互排斥,但如果为不同的对象调用它们则不会。它们不涉及测试监视器,因此它们不排除静态方法。

【讨论】:

    【解决方案2】:

    所以有两个线程同时调用method1和 方法2同时。感觉只允许其中一种方法 打电话

    这对我来说没有任何意义。

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

    【讨论】:

      【解决方案3】:

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

      调用method1method2 的线程将被锁定在Test.class,而对于method3method4 它将被锁定在this

      所以调用method1method3 的线程不会互相阻塞,而调用method3method4 的线程如果使用Test 的相同实例,则会互相阻塞。

      【讨论】:

        【解决方案4】:

        通过在静态方法上使用同步,您将在 Class 对象上进行同步。所以基本上只能从不同的线程运行一种同步方法。无法获取锁的会等待第一种方法完成

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

        所以:

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

        method3 和method4 在不同线程调用时不会同时运行

        method1 和 method3 如果从不同的线程调用,它们将同时运行(method2 和 method 4 相同)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-08
          • 2012-03-22
          • 1970-01-01
          • 1970-01-01
          • 2016-09-19
          • 2016-09-22
          • 2016-05-19
          • 2020-05-17
          相关资源
          最近更新 更多