【问题标题】:JVM fairness while scheduling threads调度线程时的 JVM 公平性
【发布时间】:2016-04-14 14:31:50
【问题描述】:

在调度线程执行时,是否有任何关于 JVM 公平性的假设?

对于下面的sn-p,是否可以只执行“代码A”而忽略B?

public static void main(String args[]) {

    new Thread() {
      public void run() {
        for (;;) { /* code A */ }
      }
    }.start();

    new Thread() {
      public void run() {
        for (;;) { /* code B */ }
      }
    }.start();

}

这个问题更多是理论上的问题 - 让我们假设两个线程都没有被阻塞或鼓励调度程序切换上下文。

【问题讨论】:

  • 您的操作系统很可能支持抢先式多任务,在这种情况下,它将上下文切换这些线程。如果您有多个空闲 CPU,它们大部分时间都会运行。
  • 好点重新 CPU 编号。只考虑一种 CPU 方案。
  • 当今大多数计算机都有很多 CPU,甚至包括手机和树莓派。 ;)

标签: java multithreading jvm


【解决方案1】:

在调度线程执行时,是否有任何关于 JVM 公平性的假设?

没有。

对于下面的sn-p,是否可以只执行“代码A”而忽略B?

理论上是的。

在实践中:

    1234563
  • 如果有多个(可用)内核,我希望两个线程并行运行。


请注意,JLS 或 JVM 规范都没有提及线程调度或公平性。 Thread 的 javadoc 也没有。

据我所知,唯一提到公平的 Java API 是 ReentrantLock API (javadoc),其中有一个构造函数参数用于创建具有公平策略的锁。这意味着调度程序偏爱在锁上等待时间最长的线程。但即使这样也有警告:

“但是请注意,锁的公平性并不能保证线程调度的公平性。”

【讨论】:

  • 这里假设只有一个 CPU。在具有备用 CPU 的多 CPU 系统上,几乎所有时间都可能运行。 +1
猜你喜欢
  • 1970-01-01
  • 2019-05-26
  • 2020-12-06
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多