我需要在多个线程上同步。我不创建线程,但我知道有多少。所以我写了这个内部保护块:
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()
循环中释放之前被第二次调用,这显然搞砸了守卫的整个逻辑。所以我需要让线程在从警卫中释放之前以某种方式加入。有这个设计吗?什么是完成它的最优雅的方式。请记住,线程不是由我创建的。
谢谢。