持有监视器的 Java 线程

标签 java multithreading synchronization

我正在阅读有关 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/

相关文章:

java - 使用正则表达式和定界符提取数据

java - 如何在 Eclipse 中使用 MySql 数据库

java - 在java中使用纸张扫描仪需要哪些库?

python - 更简单的 Python 并发构建 block ?

c - 寻找线程同步性能问题的解释

java - Esper : Group Tick data on Security , 查找一天中的最大值和最小值。然后进行进一步的计算

multithreading - 如何阻塞主线程等待完成 block 结束

multithreading - 使用 Clojure core.async 限制进程

multithreading - 一般与信号量会合

python - 监控同步: Implementing multiple condition variables