为什么CountDownLatch来源如此复杂?

时间:2016-05-01 06:11:40

标签: java multithreading concurrency java.util.concurrent

我想知道为什么utils.concurrent有这么复杂的源代码。 这是我为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

1 个答案:

答案 0 :(得分:2)

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

我在CountDownLatch中通过私有Synch类看到的一个重要特性是检查中断标志。这在将使用数十亿次的公共库代码中非常重要。这意味着如果在某个地方之前设置了中断标志,CountDownLatch将尊重它并且不会进入任何等待情况。这允许线程在应用程序结束时不挂起,并且所有线程都应该被中断。当我关闭一个应用程序并被强制用-9信号杀死PID时,我发现这个问题很多。通常的罪魁祸首是糟糕的多线程代码,它无法正确处理中断或检查它。