我想在我的代码中使用以下类似信号量的同步原语:
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
是最好的候选人,所以我将接受其中一个答案。虽然在这种情况下我不喜欢它,因为它没有提供清晰的语义并且缺乏可读性。
答案 0 :(得分:3)
答案 1 :(得分:0)
您可能想要使用CountDownLatch
。初始化为1 cdl = new CountDownLatch(1)
,等待线程将调用阻塞方法cdl.await()
,而通知线程将调用cdl.countDown()
。
您必须创建新的CountDownLatch
对象,因为它没有重置方法。值得记住memory consistency errors,但在您的情况下,访问此变量的所有方法都是同步的,因此它不会成为问题。
或者,您可以使用CyclicBarier
,然后所有线程都将调用cb.await()
。使用线程数cb = new CyclicBarrier(2)
初始化它,然后方法await
将阻塞,直到2个线程正在等待,并且只允许这两个线程前进。