2013-12-20 42 views
3

我不明白为什么t3不会饿死,因为只有一个锁,并且总是有一些高优先级的线程在等待它(因为我看到它,如果t1获取锁定,t2等待,而相反。那么,为什么t3获得锁?为什么线程没有在我的例子中饿死

public class Starvation { 

    public static int count = 0; 

    public static void main(String[] args){ 

     final CountDownLatch latch = new CountDownLatch(3); 
     final Object lock = new Object(); 

     Thread t1 = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        latch.countDown(); 
        latch.await(); 
        while(count<100){ 
         synchronized (lock) { 
          count++; 
          System.out.println("Count 1"); 
         } 
        } 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 

     Thread t2 = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        latch.countDown(); 
        latch.await(); 
        while(count<100){ 
         synchronized (lock) { 
          count++; 
          System.out.println("Count 2"); 
         } 
        } 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 

     Thread t3 = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        latch.countDown(); 
        latch.await(); 
        while(count <100){ 
         synchronized (lock) { 
          count++; 
          System.out.println("Count 3"); 
         } 
        } 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 

     t1.setPriority(Thread.MAX_PRIORITY); 
     t2.setPriority(Thread.MAX_PRIORITY); 
     t3.setPriority(Thread.MIN_PRIORITY); 

     t1.start(); 
     t2.start(); 
     t3.start(); 

     try { 
      t1.join(); 
      t2.join(); 
      t3.join(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 
+1

我会注意到你有三次_exact same_code - 即使在测试用例中,创建一个'class'和它的三个实例也是一个好习惯。特别是当人们不必手动比较时,请仔细检查您是否正确复制/粘贴了代码... –

+0

您正在使用哪种操作系统?不同的操作系统有不同的线程调度策略 – jalf

+0

鲍里斯蜘蛛 - 你是对的,下次我会的。 jalf-也许我错了,但我不认为它与操作系统有关..因为JVM会安排这个线程。 – user2212726

回答

3

我无法理解为什么T3是没有得到饥饿,因为只有一个锁,总是有一些高优先级线程等待它(因为我看到它,如果t1获得锁,t2等待,而相反......那么为什么T3获得锁?

典型的线程实现的优先级特别会尽力不让线程陷入困境。如果有更高优先级的线程,那么它们可以运行更多t3但是t3将被给出循环。另外,如果您的硬件具有2个以上的CPU,则可以在休眠CPU上调度t3,而不管其他线程的优先级如何。

例如,我见过保持优先级和优先级计数器的线程优先级系统。每次线程获得一个时间片时,其优先级计数器递减。然后,当它达到0时,它会再次回到最大值。这意味着在某个时候,一个较低优先级的线程将拥有一个相同或更高的优先级计数器,并且会获得周期。但是这是特定操作系统,可能还有其他方法来实现它。

真的线程的优先级应该被认为是提示到底层操作系统。尽管我已经写了很多线程代码,但我很少使用优先级。

相关问题