【发布时间】:2012-09-19 10:06:13
【问题描述】:
当两个线程同时使用不同的实例调用静态同步方法时会发生什么?是否可以?对象锁用于非静态同步方法,但什么类型的锁用于静态同步方法?
【问题讨论】:
-
静态方法忽略实例变量(如果提供)。它甚至可以是
null而不会出错。对于静态方法,使用类对象。
标签: java multithreading static synchronized
当两个线程同时使用不同的实例调用静态同步方法时会发生什么?是否可以?对象锁用于非静态同步方法,但什么类型的锁用于静态同步方法?
【问题讨论】:
null 而不会出错。对于静态方法,使用类对象。
标签: java multithreading static synchronized
这与在实现该方法的Class 对象上同步相同,所以是的,有可能,是的,该机制有效地忽略了调用该方法的实例:
class Foo {
private static synchronized doSomething() {
// Synchronized code
}
}
是写这个的捷径:
class Foo {
private static doSomething() {
synchronized(Foo.class) {
// Synchronized code
}
}
}
【讨论】:
有可能。
线程锁定在类的 Class 对象上,就像在 MyClass.class 上一样。
见JLS, Section 8.4.3.6. synchronized Methods:
8.4.3.6。同步方法
同步方法在执行之前获取监视器(第 17.1 节)。
对于类(静态)方法,与该类关联的监视器 使用方法类的对象。
【讨论】:
静态同步方法对 java.lang.Class 类型的实例使用锁。也就是说,每个可访问的类在运行时由一个 Class 类型的对象表示,并且该对象由静态同步方法使用。
【讨论】:
当使用静态锁时,对象会被忽略。锁是在类而不是对象上获取的。
【讨论】: