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语句,但是这很容易受到虚假唤醒的影响.
你可以使用CountDownLatch或者CyclicBarrier.
使用a Future也是一种可能性,FutureTask更具体.它有一个Conveniance方法get(),可用于阻止代码执行,直到Future完成其工作,从而满足您的要求.
您还可以实现自己的障碍,这将wait()在循环中执行,直到满足某个条件.实现该条件将触发notifyAll(),循环将完成并且所有线程可以继续.但这将重新发明轮子.
| 归档时间: |
|
| 查看次数: |
1664 次 |
| 最近记录: |