【发布时间】:2010-12-27 13:39:23
【问题描述】:
当我创建一个多线程程序并使用诸如 Wait 或 Signal 之类的方法来控制线程等时,JVM 是否控制所有线程状态更改或底层操作系统是否与它有任何关系。
【问题讨论】:
标签: java multithreading operating-system jvm
当我创建一个多线程程序并使用诸如 Wait 或 Signal 之类的方法来控制线程等时,JVM 是否控制所有线程状态更改或底层操作系统是否与它有任何关系。
【问题讨论】:
标签: java multithreading operating-system jvm
这取决于JVM的实现。大多数现代 JVM(Suns HotSpot、Oracles JRockit、IBM VM)将使用操作系统线程模型,因为这将提供最佳性能。
早期实现使用绿色线程 - 虚拟机使用自身对线程进行建模。这通常在运行它的平台或操作系统不支持线程时使用。例如,在 Java 1.1 中,在 Solaris 上使用了绿色线程。当时,在 Solaris 中使用多个内核/CPU 的常见模式是使用多个进程 - 只是后来线程才被添加到操作系统中。
Java 语言规范没有指定必须如何实现线程,但一般来说,如果操作系统支持线程,现代 JVM 将使用操作系统实现。当操作系统不支持时,例如在低端手机或 Java Card 实现中,则运行时将使用绿色线程。
【讨论】:
一般来说,Java 线程会映射到 OS 线程,Java 会利用 OS 同步原语来实现 synchronized/wait/signal/...,但映射并不像您想象的那么简单。事实上,JVM 使用了一些巧妙的技巧来提高性能并实现尽可能多的同步代码本身(至少在无竞争的情况下)。
如果您真的对细节感兴趣,请查看 JVM 源代码或cmeerw.org/notes/java_sync.html,它提供了有关如何在 Linux 和 Solaris 上实现 Java 同步原语的一些概述。
【讨论】:
在 linux 2.4 的早期,至少 IBM JVM 使用单独的进程来实现 java 线程。这导致在线程之间切换很长时间,因为系统每次都需要激活完全不同的进程。
【讨论】: