提问人:David Kerr 提问时间:9/16/2008 更新时间:11/21/2008 访问量:1931
是否有在任何地方都可以在 Windows XP 下运行的 Java 线程模型的规范?[关闭]
Is there a specification of Java's threading model running under Windows XP available anywhere? [closed]
问:
我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便用事实和引文来回答。
5年前关闭。
有各种文档描述了 Solaris/Linux 上的线程,但没有描述 Windows 实现。我对此有短暂的兴趣,如此重要的事情(似乎)没有记录下来,这似乎很奇怪。
线程在不同的操作系统上是不一样的 - “一次编写,随处运行”不适用于线程。
答:
本文讨论了 Solaris 线程模型以及 VM 如何映射到该模型。这与 Linux 无关。此外,本文档仅讨论性能。无论您选择什么,程序的整体行为都不应改变。
Java 公开的线程模型在每个平台上都是相同的,并在 Java 规范中定义。对于 Java 应用程序,底层操作系统应该是完全透明的,即使对于线程也是如此。
不过,如果你必须知道......Sun JVM 将其线程 1:1 映射到 Windows 线程。它不使用多个工艺或纤维。
该文档更多地介绍了 Solaris 线程,而不是 Java 线程模型。所有 JVM 都调用它们所针对的操作系统的本机线程 API,因此操作系统线程始终有一个 Java 线程。文档中的图表显示,直到线程位于操作系统空间中,它们才会发生变化。每个操作系统都可以以不同的方式处理线程,对于特定于 Windows 的文档,这里是一个很好的起点:MSDN 关于进程和线程。
很长一段时间以来,各种风格的 *nix 都使用进程而不是实际线程来实现其线程,似乎这些特定的调整参数可以简化向 Solaris 中较新线程模型的过渡。这使得旧模型和那些 JVM 选项过时了。
有关 HotSpot JVM 的 JVM 选项列表,您可以查看:HotSpot VM 选项。其中很多对于调整长时间运行的应用程序很有用,但如果您不了解它们在做什么,也可能会遇到麻烦。还要记住,JVM 的每个实现都可以有一组不同的选项,其中一些选项在 IBM 的 VM 或 BEA 上是找不到的。
这实际上取决于特定的 JVM 实现。我假设你对 Sun 的 Windows JVM 感到好奇,我可以肯定地告诉你,Sun JVM 将 Java 线程映射到操作系统线程。
您可以尝试从 Java 代码中生成几个线程,打开任务管理器,看看发生了什么。
为了最直接地回答您的问题,JVM 规范故意不定义关于线程如何实现的精确语义。
FWIW,Sebastion 的声明是“Java 公开的线程模型在每个平台上都是相同的,并在 Java 规范中定义。对于 Java 应用程序来说,底层操作系统应该是完全透明的,即使对于线程也是如此“,这是不准确的。
我发现 Windows 和 Linux 下的线程在使用 wait/notify 的线程匮乏方面存在显着的经验差异。当许多线程争夺一个锁时,Linux 更容易出现匮乏 - 以至于我不得不在 Windows 中加载比 Linux 多 3 个数量级的线程才能导致匮乏。对于严重争用的锁,带有 fair 修饰符的 Java 并发锁变得至关重要。
为了说明数字,我在 Linux 下遇到了一个问题,一个锁被 31 个线程严重竞争,而在 Windows 下,相同的代码需要 10,000 个(是的,那是 10,000 个)线程才能开始演示饥饿问题。
更糟糕的是,Linux 下有 3 种不同的线程模型,每种模型都有不同的特征。
根据我的经验,大多数情况下,线程是透明的,但争用问题值得仔细考虑。
评论