调度线程时JVM的公平性

时间:2016-04-14 14:31:51

标签: java multithreading jvm

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

对于以下代码段,是否可以只执行“代码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();

}

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

1 个答案:

答案 0 :(得分:2)

  

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

没有

  

对于以下代码段,是否可以使用"代码A"只执行,B被忽略?

理论上是的。

在实践中:

  • 如果有一个(可用的)核心,我希望操作系统级别的线程调度程序对线程进行时间分片,以便它们各自在日志条件中获得大约50%的可用时间

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

请注意,JLS或JVM规范都没有说明有关线程调度或公平性的任何信息。 Thread的javadoc也没有。

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

  

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