Java同步原语

时间:2015-08-26 12:05:52

标签: java concurrency

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

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是最好的候选人,所以我将接受其中一个答案。虽然在这种情况下我不喜欢它,因为它没有提供清晰的语义并且缺乏可读性。

2 个答案:

答案 0 :(得分:3)

java.util.concurrent提供高级并发性。

CountDownLatch将解析您的查询。

请浏览docuementation

答案 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个线程正在等待,并且只允许这两个线程前进。