为什么 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 时,我经常看到这个问题。通常的罪魁祸首是糟糕的多线程代码,它没有正确处理中断也没有检查中断。
我想知道为什么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 时,我经常看到这个问题。通常的罪魁祸首是糟糕的多线程代码,它没有正确处理中断也没有检查中断。