在Solaris / Linux上有各种描述线程的文档,但现在描述了Windows实现。我对此感兴趣,似乎很奇怪的是,某些如此重要的东西(貌似)没有记录。
不同操作系统上的线程不一样 - “一次编写,随处运行”不适用于线程。
答案 0 :(得分:3)
为了最直接地回答您的问题,JVM规范故意不会定义关于如何实现线程的精确语义。
FWIW,Sebastion的声明“Java的暴露线程模型在每个平台上是相同的,并在Java规范中定义。对于Java应用程序,底层操作系统应该完全透明,即使是线程化”,也是不准确的。
我发现Windows和Linux之间使用wait / notify进行线程饥饿的线程之间存在显着的经验差异。当许多线程争用单个锁时,Linux 显着更容易出现饥饿 - 在某种程度上我不得不在Windows中加载3个数量级更多线程导致饥饿比在Linux中。对于严重争用的锁,使用fair修饰符的Java并发锁变得至关重要。
为了说明数字,我在Linux下遇到了一个问题,其中一个锁被31个线程强烈争用,其中Windows下的相同代码需要10,000个(是的,那个10 千)线程才能开始演示饥饿问题
更糟糕的是,Linux下有3种不同的线程模型,每种模式都有不同的特性。
大多数情况下,线程在我的经验中是透明的,但争用问题值得仔细考虑。
答案 1 :(得分:2)
这实际上取决于具体的JVM实现。我假设您对Sun的Windows JVM感到疑惑,我可以肯定地告诉您Sun JVM将Java线程映射到OS线程。
您可以尝试从Java代码中生成几个线程,打开任务管理器,看看发生了什么。
答案 2 :(得分:0)
有问题的文档讨论了Solaris线程模型以及VM如何映射到它。这与Linux无关。此外,该文档仅讨论性能。无论你选择什么,该计划的整体行为都不应改变。
Java公开的线程模型在每个平台上都是相同的,并在Java规范中定义。对于Java应用程序,即使是线程化,底层操作系统也应该完全透明。
如果你必须知道,那么...... Sun JVM将其线程1:1映射到Windows线程。它不使用多个过程或光纤。
答案 3 :(得分:-1)
该文档比Java线程模型更多地涉及Solaris线程。所有JVM都调用它们编写的操作系统的本机线程API,因此OS线程总有一个Java线程。文档中的图表显示,直到线程在OS空间中才会发生变化。每个操作系统都可以以不同的方式处理线程,对于Windows特定的文档,这里是一个很好的起点:MSDN About Processes and Threads。
很长一段时间以来,* nix的各种风格都使用进程而不是实际线程实现了它们的线程,似乎那些特定的调优参数可以轻松地过渡到Solaris中的新线程模型。这使旧模型和那些JVM选项过时了。
有关HotSpot JVM的JVM选项列表,您可以查看:HotSpot VM Options。其中很多对于调整长时间运行的应用程序很有用,但如果你不了解它们正在做什么,你也会遇到麻烦。还要记住,JVM的每个实现都可以有一组不同的选项,您在IBM的VM或BEA上找不到它们。