我想要在代码中使用以下类似信号量的同步原语:
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个线程前进。