2016-05-01 86 views
-2

我想知道为什么utils.concurrent有这么复杂的源代码。 这是我为CountDownLatch提出的一些代码,经过测试后,我期待在源代码中找到类似的东西,但不是,它是非常复杂的。为什么CountDownLatch源代码如此复杂?

我的实施有错吗?

public class CountDown { 

    private int count; 
    private Object lock; 

    public CountDown(int count) 
    { 
     lock = new Object(); 
     this.count = count; 
    } 
    //Just waits until it is notified by CountDown. Keeps waiting if not 0. 
    public void await() throws InterruptedException 
    { 
     synchronized (lock) { 
      while(count != 0) 
      { 
       lock.wait(); 
      } 
     } 
    } 
    //Decreases the count and notifies for await's lock. 
    public void countDown() 
    { 
     synchronized (lock) { 
      this.count--; 
      lock.notify();   
     } 
    } 
} 

而这里的源代码:Source Code CountDownLatch

+0

你的实现没有那么多的功能。如果您添加所有缺少的功能,您的实施将看起来几乎相同。 –

+0

功能如?有非常复杂的方法,例如,私人类Sync中的循环是什么? –

+0

哦哇...如果有人会倒下,至少请告诉我为什么请。 –

回答

1

CountDownLatch似乎只是一个包装的AbstractQueuedSynchronizer。我认为道格可能会注意到这一点,并决定采用这种方法,进一步导致其目前的设计。

通过私有Synch类,我在CountDownLatch中看到的一个重要功能是检查中断标志。这在使用数十亿次的通用库代码中非常重要。这意味着如果中断标志设置在某个地方之前,CountDownLatch会尊重它,并且不会进入任何等待状态。这允许线程在应用程序结束并且所有线程都应该中断时不挂起。当我关闭一个应用程序并被强制使用-9信号终止PID时,我看到这个问题很多。通常的罪魁祸首是坏的多线程代码,它不能正确处理中断,也不会检查它。

+0

谢谢,我从来没有想过这种可能性。 –

相关问题