加入的守卫块

时间:2011-01-02 19:37:33

标签: java multithreading join guard

我需要在多个线程上进行同步。我没有创建线程,但我确实知道有多少。所以我写了这个内部保护区:

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()循环中释放之前被第二次调用,这显然搞砸了守卫的整个逻辑。所以我需要让线程以某种方式加入,然后才能从防守中释放出来。这有设计吗?实现它的最优雅方式是什么?请记住,线程不是由我创建的。

感谢。

1 个答案:

答案 0 :(得分:4)

听起来像CountDownLatch的工作。您可以将锁存器设置为等待N次计数。有关示例,请参阅Javadoc。