我有以下情况.几个线程正在等待相同的条件.当得到通知时,所有应该停止等待,更改标志并返回对象:
public Object getObject(){
lock.lock();
try {
while (check)){
condition.await();
}
return returnObjectAndSetCheckToFalse();
} finally {
lock.unlock();
}
}
但是这段代码不起作用,因为更快的线程可能会将check标志更改为false,而第二个更慢的线程将再次阻塞.
可能有一个逻辑,即两个等待线程都将被唤醒,它们都将check flag设置为false,并返回对象?
或许它是矛盾的?
最简单的方法是将wait更改为if语句,但是这很容易受到虚假唤醒的影响.
解决方法:
据我所知,如果你的condition.await()返回,你需要从所有线程中的方法体返回.
这个丑陋的解决方案应该有所帮助,尽管我认为有更好的解决方法:
public Object getObject() {
lock.lock();
try {
int localstate = this.state;
while (check && localstate == this.state)) {
condition.await(); // all threads that are waiting here have the same state
}
if (!check) {
this.state++; // first thread will change state thus making other threads ignore the 'check' value
}
return returnObjectAndSetCheckToFalse();
} finally {
lock.unlock();
}
}
标签:notify,java,multithreading,concurrency,wait
来源: https://codeday.me/bug/20190725/1532974.html