【发布时间】:2013-10-02 11:49:32
【问题描述】:
我有以下情况。几个线程在相同的条件下等待。并且当被通知时,都应该停止等待,更改标志并返回对象:
public Object getObject(){
lock.lock();
try {
while (check)){
condition.await();
}
return returnObjectAndSetCheckToFalse();
} finally {
lock.unlock();
}
}
但是这段代码不起作用,因为较快的线程可能会将检查标志更改为 false,而第二个较慢的线程将再次阻塞。 可能有一个逻辑,两个等待线程都将被唤醒,它们都将检查标志设置为 false,并返回对象? 或者说是矛盾的?
最简单的方法是将等待更改为 if 语句,但这很容易受到虚假唤醒的影响。
【问题讨论】:
-
横向建议:查看
java.util.concurrent并使用适当的更高级别的构造。 -
我在考虑使用future,但无论如何实现都需要这样的代码。
-
怎么样?让所有线程等待同一个
Future似乎就足够了。 (这很难说,因为您没有展示用例。)您可能需要稍微重构您的代码,以便数据流基于从生产者到消费者的“拉”对象,但这通常是一个好主意。 -
未来的代码将几乎相同。 check 将是 Future.isDone() - 但带有否定。而 return 和 set 将返回并将 done 值设置为 true。
-
你到底想达到什么目标?
标签: java multithreading concurrency wait notify