我想知道为什么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
答案 0 :(得分:2)
CountDownLatch似乎只是AbstractQueuedSynchronizer的包装器。我认为可能是道格注意到这一点,并决定采用这种方法,这进一步导致其当前的设计。
我在CountDownLatch中通过私有Synch类看到的一个重要特性是检查中断标志。这在将使用数十亿次的公共库代码中非常重要。这意味着如果在某个地方之前设置了中断标志,CountDownLatch将尊重它并且不会进入任何等待情况。这允许线程在应用程序结束时不挂起,并且所有线程都应该被中断。当我关闭一个应用程序并被强制用-9信号杀死PID时,我发现这个问题很多。通常的罪魁祸首是糟糕的多线程代码,它无法正确处理中断或检查它。