5

很明显,操作系统调度/线程算法对 Java 线程有影响,但是

我们可以安全地说线程依赖于操作系统/机器吗?

如果是这种情况,那么它不会使 Java 平台依赖吗?

4

3 回答 3

7

是的,Java 中线程调度的细节取决于 JVM 实现和(通常)操作系统实现。

但是该调度的细节也没有在 Java SE 规范中指定,只指定了一些选定的基本规则。

这意味着只要操作系统特定的调度符合这些基本规则,它也符合 JVM 规范。

如果您的代码依赖于 JVM 规范中指定的调度细节,那么它取决于实现细节并且不能期望在任何地方都能工作。

这与文件 I/O 的情况几乎相同:如果您对路径进行硬编码并使用固定的目录分隔符,那么您的工作超出了规范,并且不能期望您的代码能够跨平台工作。

编辑:当然,JVM实现本身(即 JRE)平台相关的。它提供了允许纯 Java 程序不关心平台细节的层。为了实现这一点,JRE必须是特定于平台的。

于 2012-11-05T09:57:09.503 回答
3

... Java 通常会使用本机线程,但在某些操作系统上,它使用所谓的“绿色线程”,JVM 自行处理并由单个本机线程执行。

你不应该担心这个。它全部由 JVM 处理,对程序员是不可见的。我能想到的唯一真正区别是,在使用绿色线程的实现中,多线程分治算法不会带来性能提升。但是,对于使用本机线程但在具有单核的机器上运行的实现来说,同样缺乏性能增益。

摘自JVM 和 Java 线程调度

于 2012-11-05T09:56:56.447 回答
3

即使在同一个平台上,如果您编写不安全的多线程代码,行为可能取决于完整的配置细节、机器负载的其余部分以及很多运气,以及硬件和操作系统。一个不安全的程序可以在某一天明显正确地工作,而下一次在相同的硬件上以或多或少相同的工作量失败。

如果您编写安全的多线程代码,即仅依赖于 Java 语言规范和库 API 中承诺的代码,那么平台的选择当然会影响性能,但不会影响其功能是否正常工作。

于 2012-11-05T10:16:03.700 回答