为什么 CountDownLatch 源码这么复杂?

Why is CountDownLatch source so complicated?

我想知道为什么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

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

我通过私有同步 class 在 CountDownLatch 中看到的一个重要功能是检查中断标志。这在将被使用数十亿次的通用库代码中非常重要。这意味着如果之前在某处设置了中断标志,CountDownLatch 将遵守它并且不会进入任何等待情况。这允许线程在应用程序结束时不会挂起,并且它的所有线程都应该被中断。当我关闭应用程序并被迫使用 -9 信号终止 PID 时,我经常看到这个问题。通常的罪魁祸首是糟糕的多线程代码,它没有正确处理中断也没有检查中断。