3

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

4

4 回答 4

6

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

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

是写这个的捷径:

class Foo {
    private static doSomething() {
        synchronized(Foo.class) {
            // Synchronized code
        }
    }
}
于 2012-09-19T10:10:05.300 回答
6

有可能的。

线程锁定Class类的对象,例如 on MyClass.class

参见JLS,第 8.4.3.6 节。同步方法

8.4.3.6。同步方法

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

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

于 2012-09-19T10:10:11.140 回答
0

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

于 2012-09-19T10:11:41.300 回答
0

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

于 2017-08-20T07:36:33.363 回答