当两个线程同时使用不同的实例调用静态同步方法时会发生什么?可能吗?对象锁用于非静态同步方法,但是什么类型的锁用于静态同步方法?
答案 0 :(得分:6)
与在实现该方法的Class
对象上进行同步相同,所以是的,这是可能的,是的,该机制有效地忽略了调用该方法的实例:
class Foo {
private static synchronized doSomething() {
// Synchronized code
}
}
是写这个的捷径:
class Foo {
private static doSomething() {
synchronized(Foo.class) {
// Synchronized code
}
}
}
答案 1 :(得分:6)
有可能。
线程锁定了类的Class
对象,就像在MyClass.class
上一样。
请参阅JLS, Section 8.4.3.6. synchronized Methods:
<强> 8.4.3.6。同步方法
同步方法在执行之前获取监视器(第17.1节)。
对于类(静态)方法,与类关联的监视器 使用方法类的对象。
答案 2 :(得分:0)
静态同步方法在java.lang.Class类型的实例上使用锁。也就是说,每个可访问类在运行时由类型为Class的对象表示,该对象由静态同步方法使用。
答案 3 :(得分:0)
使用静态锁定时,将忽略对象。锁是在类而不是对象上获取的。