如何唤醒等待相同条件的所有线程?

gom*_*mul 3 java concurrency multithreading notify wait

我有以下情况.几个线程正在等待相同的条件.当得到通知时,所有应该停止等待,更改标志并返回对象:

 public Object getObject(){
    lock.lock();
    try {
        while (check)){
            condition.await();
        }

        return returnObjectAndSetCheckToFalse();
    } finally {
        lock.unlock();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是这段代码不起作用,因为更快的线程可能会将check标志更改为false,而第二个更慢的线程将再次阻塞.可能有一个逻辑,即两个等待线程都将被唤醒,它们都将check flag设置为false,并返回对象?或许它是矛盾的?

最简单的方法是将wait更改为if语句,但是这很容易受到虚假唤醒的影响.

Dar*_*usz 5

你可以使用CountDownLatch或者CyclicBarrier.

使用a Future也是一种可能性,FutureTask更具体.它有一个Conveniance方法get(),可用于阻止代码执行,直到Future完成其工作,从而满足您的要求.

您还可以实现自己的障碍,这将wait()在循环中执行,直到满足某个条件.实现该条件将触发notifyAll(),循环将完成并且所有线程可以继续.但这将重新发明轮子.