【问题标题】:java static synchronized methodjava静态同步方法
【发布时间】:2012-09-19 10:06:13
【问题描述】:

当两个线程同时使用不同的实例调用静态同步方法时会发生什么?是否可以?对象锁用于非静态同步方法,但什么类型的锁用于静态同步方法?

【问题讨论】:

标签: java multithreading static synchronized


【解决方案1】:

这与在实现该方法的Class 对象上同步相同,所以是的,有可能,是的,该机制有效地忽略了调用该方法的实例:

class Foo {
    private static synchronized doSomething() {
        // Synchronized code
    }
}

是写这个的捷径:

class Foo {
    private static doSomething() {
        synchronized(Foo.class) {
            // Synchronized code
        }
    }
}

【讨论】:

    【解决方案2】:

    有可能。

    线程锁定在类的 Class 对象上,就像在 MyClass.class 上一样。

    JLS, Section 8.4.3.6. synchronized Methods:

    8.4.3.6。同步方法

    同步方法在执行之前获取监视器(第 17.1 节)。

    对于类(静态)方法,与该类关联的监视器 使用方法类的对象。

    【讨论】:

      【解决方案3】:

      静态同步方法对 java.lang.Class 类型的实例使用锁。也就是说,每个可访问的类在运行时由一个 Class 类型的对象表示,并且该对象由静态同步方法使用。

      【讨论】:

        【解决方案4】:

        当使用静态锁时,对象会被忽略。锁是在类而不是对象上获取的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多