【问题标题】:Does the JVM or the underlying OS handle thread state changesJVM 或底层操作系统是否处理线程状态更改
【发布时间】:2010-12-27 13:39:23
【问题描述】:

当我创建一个多线程程序并使用诸如 Wait 或 Signal 之类的方法来控制线程等时,JVM 是否控制所有线程状态更改或底层操作系统是否与它有任何关系。

【问题讨论】:

    标签: java multithreading operating-system jvm


    【解决方案1】:

    这取决于JVM的实现。大多数现代 JVM(Suns HotSpot、Oracles JRockit、IBM VM)将使用操作系统线程模型,因为这将提供最佳性能。

    早期实现使用绿色线程 - 虚拟机使用自身对线程进行建模。这通常在运行它的平台或操作系统不支持线程时使用。例如,在 Java 1.1 中,在 Solaris 上使用了绿色线程。当时,在 Solaris 中使用多个内核/CPU 的常见模式是使用多个进程 - 只是后来线程才被添加到操作系统中。

    Java 语言规范没有指定必须如何实现线程,但一般来说,如果操作系统支持线程,现代 JVM 将使用操作系统实现。当操作系统不支持时,例如在低端手机或 Java Card 实现中,则运行时将使用绿色线程。

    【讨论】:

    • 此外,绿色线程已从 sun java 代码中完全删除,不再受支持。无论如何,实施被认为是相当糟糕的。
    • 对于所有现代桌面/服务器 JVM,是的 - 对于低端手机或 Java 智能卡,它们可能仍使用绿色线程。
    【解决方案2】:

    一般来说,Java 线程会映射到 OS 线程,Java 会利用 OS 同步原语来实现 synchronized/wait/signal/...,但映射并不像您想象的那么简单。事实上,JVM 使用了一些巧妙的技巧来提高性能并实现尽可能多的同步代码本身(至少在无竞争的情况下)。

    如果您真的对细节感兴趣,请查看 JVM 源代码或cmeerw.org/notes/java_sync.html,它提供了有关如何在 Linux 和 Solaris 上实现 Java 同步原语的一些概述。

    【讨论】:

      【解决方案3】:

      在 linux 2.4 的早期,至少 IBM JVM 使用单独的进程来实现 java 线程。这导致在线程之间切换很长时间,因为系统每次都需要激活完全不同的进程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-16
        • 1970-01-01
        • 1970-01-01
        • 2013-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多