JVM或底层操作系统是否处理线程状态更改

时间:2009-12-17 08:03:05

标签: java multithreading operating-system jvm

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

3 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:3)

通常,Java线程将映射到OS线程,Java将使用OS同步原语来实现synchronized / wait / signal / ...,但映射并不像您想象的那么简单。实际上,JVM使用一些聪明的技巧来提高性能并实现尽可能多的同步代码本身(至少是无竞争的情况)。

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

答案 2 :(得分:2)

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