是否有可在任何地方运行的Windows XP下运行的Java线程模型规范?

时间:2008-09-15 21:29:46

标签: java multithreading documentation

在Solaris / Linux上有各种描述线程的文档,但现在描述了Windows实现。我对此感兴趣,似乎很奇怪的是,某些如此重要的东西(貌似)没有记录。

不同操作系统上的线程不一样 - “一次编写,随处运行”不适用于线程。

请参阅http://java.sun.com/docs/hotspot/threads/threads.html

4 个答案:

答案 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上找不到它们。