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