我有以下情况。几个线程在相同的条件下等待。当收到通知时,都应该停止等待,更改标志并返回对象:
public Object getObject(){
lock.lock();
try {
while (check)){
condition.await();
}
return returnObjectAndSetCheckToFalse();
} finally {
lock.unlock();
}
}
但是此代码不起作用,因为较快的线程可能会将检查标志更改为 false,而第二个较慢的线程将再次阻塞。可能有一个逻辑,两个等待线程都将被唤醒,它们都将检查标志设置为 false,并返回对象?或者也许是矛盾的?
最简单的方法是将等待更改为 if 语句,但这很容易受到虚假唤醒的影响。