Java静态同步方法

3
当两个线程同时使用不同实例调用静态同步方法时会发生什么?这种情况可能发生吗?非静态同步方法使用对象锁,而静态同步方法使用什么类型的锁?

1
静态方法会忽略提供的实例变量。即使它是 null,也不会出错。对于静态方法,使用类对象。 - Peter Lawrey
1
讨论在https://dev59.com/jXRC5IYBdhLWcg3wAcXU中。 - yair
4个回答

6

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

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

"

"是写作下面这段内容的快捷方式:

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

6

这是可能的。

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

详见JLS第8.4.3.6节:同步方法

8.4.3.6. 同步方法

在执行同步方法之前,该方法会获取一个监视器(§17.1)。

对于一个类(静态)方法,使用与该方法所在类相关联的Class对象的监视器。


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

0

使用静态锁时,对象会被忽略。锁定的是类而不是对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接