我正在阅读有关 Java 线程的内容,碰巧阅读了 this博客。 在博客中我看到一个声明:
在同步方法的执行期间,线程持有该方法对象的监视器,或者如果该方法是静态的,它持有该方法类的监视器。
谁能告诉我:
- 一个线程持有方法对象的监视器
- 一个线程持有方法类的监视器
最佳答案
这意味着同步实例方法大致等同于:
public class FooClass {
public void foo() {
synchronized(this) {
...
}
}
}
而同步静态方法大致等同于:
public class FooClass {
public static void foo() {
synchronized(FooClass.class) {
...
}
}
}
所以在实例方法的情况下,它将在 FooClass
的实例上同步(并且在其他线程中调用 foo
在其他实例上 将不阻塞),而在静态方法的情况下,它在 Class
对象本身上同步。
请注意,对于静态方法版本,重要的是包含该方法的类 - 即使该方法名义上被称为“在”子类上(例如 SubFooClass.foo()
) 该方法仍然在声明它的类上获得监视器。
参见 JLS section 8.4.3.6了解更多详情。
关于持有监视器的 Java 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22327498/