当两个线程同时使用不同实例调用静态同步方法时会发生什么?这种情况可能发生吗?非静态同步方法使用对象锁,而静态同步方法使用什么类型的锁?
这与在实现方法的Class
对象上同步相同,因此是可能的,并且该机制有效地忽略了调用方法的实例:
class Foo {
private static synchronized doSomething() {
// Synchronized code
}
}
"是写作下面这段内容的快捷方式:
class Foo {
private static doSomething() {
synchronized(Foo.class) {
// Synchronized code
}
}
}
这是可能的。
线程会锁定类的Class
对象,例如MyClass.class
。
8.4.3.6. 同步方法
在执行同步方法之前,该方法会获取一个监视器(§17.1)。
对于一个类(静态)方法,使用与该方法所在类相关联的
Class
对象的监视器。
使用静态锁时,对象会被忽略。锁定的是类而不是对象。
null
,也不会出错。对于静态方法,使用类对象。 - Peter Lawrey