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

时间:2020-03-05 18:54:36  来源:igfitidea点击:

有各种各样的文档描述了Solaris / Linux上的线程,但是现在描述了Windows的实现。我对此有浓厚的兴趣,奇怪的是,(似乎)没有记录如此关键的事情。

在不同操作系统的"一次写入,在任何地方运行"上的线程处理并不相同。

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

解决方案

回答

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

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

但是,如果我们必须知道... Sun JVM会将其线程1:1映射到Windows线程。它不使用多个进程或者光纤。

回答

该文档比Java线程模型更多关于Solaris线程。所有JVM都会调用为其编写的OS的本机线程API,因此OS线程始终只有一个Java线程。文档中的图显示,直到线程进入OS空间后,线程才会更改。对于Windows特定的文档,每种操作系统都可以以不同的方式处理线程,这里是一个不错的起点:MSDN关于进程和线程。

长期以来,各种形式的* nix都使用进程而不是实际线程来实现其线程,似乎那些特定的调整参数可以在某种程度上简化向Solaris中较新的线程模型的过渡。这使得较旧的模型和那些JVM选项已过时。

有关HotSpot JVM的JVM选项的列表,请查看:HotSpot VM选项。其中许多对于调整长期运行的应用程序很有用,但是如果我们不了解它们在做什么,也可能会遇到麻烦。还请记住,JVM的每个实现都可以具有不同的选项集,而在IBM的VM或者BEA上找不到这些选项。

回答

它实际上取决于特定的JVM实现。我假设我们想知道Sun的Windows JVM,并且可以肯定地说Sun JVM将Java线程映射到OS线程。

我们可以尝试从Java代码中产生几个线程,打开"任务管理器",然后看看发生了什么。

回答

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

FWIW,Sebastion的说法是"不准确的"," Java的公开线程模型在每个平台上都是相同的,并且在Java规范中定义。对于Java应用程序,底层OS即使对于线程也应该是完全透明的"。

我发现Windows和Linux下的线程之间在使用等待/通知进行线程饥饿方面存在明显的经验差异。当许多线程争用单个锁时,Linux导致饥饿的程度要比Linux多得多,Linux明显更容易饿死。对于竞争激烈的锁,带有公平修饰符的Java并发锁变得至关重要。

为了说明数字,我在Linux下遇到问题,其中一个锁严重受到31个线程的争夺,而Windows下的同一代码需要10,000(是的,一万)个线程才能开始演示饥饿问题。

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

在我的经验中,线程通常是透明的,但是争用问题值得仔细考虑。