我需要在多个线程上进行同步。我没有创建线程,但是我知道有多少个线程。所以我写了这个内部防护块:
private class Guard {
int waiters = 0;
boolean wait;
synchronized void addWaiter() {
++waiters;
wait = true;
while (wait && waiters != threadNum()) {
try {
wait();
} catch (InterruptedException e) {}
}
waiters = 0;
wait = false;
notifyAll();
}
}
该受保护的块在循环中执行。因此,问题在于,第一次调用中的所有线程都可能从
wait()
循环释放之前,可能第二次被调用,这显然会破坏保护程序的整个逻辑。因此,在从保护程序中释放线程之前,我需要使它们以某种方式加入。有这个设计吗?什么是完成它的最优雅的方法。请记住,这些线程不是我创建的。谢谢。
最佳答案
听起来像CountDownLatch的工作。您可以将闩锁设置为等待N个倒计时。有关示例,请参见Javadoc。
关于java - 带联接的守卫方块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4580118/