在 Windows XP 下运行的 Java 线程模型规范是否随处可用?

有各种文档描述了 Solaris/Linux 上的线程,但没有描述 Windows 实现的地方。我对此有过兴趣,如此重要的事情(似乎)没有记录在案似乎很奇怪。

线程在不同的操作系统上是不一样的——“一次编写,随处运行”对于线程来说是不正确的。

参见 http://java.sun.com/docs/hotspot/线程/threads.html

请先 登录 后评论

3 个回答

Sebastian Redl

相关文档讨论了 Solaris 线程模型以及 VM 如何映射到它。这与Linux无关。此外,该文档仅讨论性能。无论您选择什么,程序的整体行为都不应改变。

Java 的公开线程模型在每个平台上都是相同的,并在 Java 规范中进行了定义。对于 Java 应用程序,即使对于线程,底层操作系统也应该是完全透明的。

如果你必须知道的话…… Sun JVM 将其线程 1:1 映射到 Windows 线程。它不使用多个流程或纤维。

请先 登录 后评论
Chris Broadfoot

这真的取决于具体的 JVM 实现。我假设您想知道 Sun 的 Windows JVM,我可以肯定地告诉您,Sun JVM 将 Java 线程映射到 OS 线程。

您可以尝试从 Java 代码中生成几个线程,打开任务管理器并查看发生了什么。

请先 登录 后评论
Lawrence Dol

为了最直接地回答您的问题,JVM 规范故意未定义有关如何实现线程的精确语义。

FWIW,Sebastion 的声明“Java 的公开线程模型在每个平台上都是相同的,并在 Java 规范中定义。对于 Java 应用程序,即使对于线程,底层操作系统也应该是完全透明的”,这是不准确的。

我发现 Windows 和 Linux 下的线程在使用等待/通知的线程饥饿方面存在显着的经验差异。当许多线程争夺一个锁时,Linux 明显更容易出现饥饿 - 以至于我不得不在 Windows 中加载 3 个数量级以上的线程来导致比在 Linux 中饥饿。对于竞争激烈的锁,带有 fair 修饰符的 Java 并发锁变得至关重要。

为了说明数字,我在 Linux 下遇到了一个问题,一个锁被 31 个线程严重竞争,而在 Windows 下相同的代码需要 10,000(是的,那是 10000)个线程来开始演示饥饿问题.

更糟糕的是,Linux 下有 3 种不同的线程模型,每一种都有不同的特性。

根据我的经验,大多数情况下线程是透明的,但争用问题值得仔细考虑。

请先 登录 后评论