我想要在代码中使用以下类似信号量的同步原语:

class Event {
    private boolean fired = false;

    public synchronized void fire() {
        this.fired = true;
        this.notify();
    }

    public synchronized void waitFor() throws InterruptedException {
        while (!this.fired)
            wait();
        this.fired = false;
    }
}

Java标准库(或其他流行的库)中是否可以使用具有相同语义的原语?

编辑:看来CountDownLatch是最好的候选者,所以我将接受答案之一。尽管在这种情况下我不喜欢它,因为它没有提供清晰的语义并且缺乏可读性。

最佳答案

您可能要使用CountDownLatch。用1个cdl = new CountDownLatch(1)初始化,等待线程将调用阻塞方法cdl.await(),而通知线程将调用cdl.countDown()

您将需要创建新的CountDownLatch对象,因为它没有reset方法。值得记住有关memory consistency errors的信息,但是在您的情况下,访问此变量的所有方法都是同步的,因此不会有问题。

或者,您可以使用CyclicBarier,然后所有线程都将调用cb.await()。用cb = new CyclicBarrier(2)线程数初始化它,然后await方法将阻塞直到2个线程正在等待,并且仅让这2个线程前进。

09-27 11:20