我有一个对象:
public class Resource {
private Lock lock = new ReentrantLock();
private boolean processed = false;
public Lock getLock() {
return lock;
}
public boolean isProcessed() {
return processed;
}
public void setProcessed(boolean processed) {
this.processed = processed;
}
}
我希望能够停止线程“one”,直到线程“two”将变量“processed”更改为true。在“processed”设置为true后,我希望唤醒线程“one”并继续进行一些操作。
我知道我们可以使用wait和notify方法来组织它,但这非常危险,因为可能会发生中断。
如果我只使用wait和notify方法,可能会出现无限等待的情况。
如果我们的等待方法由于某种原因被中断,在检查“process”变量仍为false之后,我们可以再次使用wait,如下所示:
while(true){
if(!resource.isProcessed()){
resource.getLock().wait();
}
else{
break;
}
}
使用这样的代码是危险的,因为在我们检查了"!resource.isProcessed()"并且在使用"resource.getLock().wait()"之前,另一个进程可以将"process"设置为true并调用"resource.getLock().notify()"(这不会产生任何效果,因为我们还没有调用"wait()")。
如何安全地等待某些条件?如何安全地通知/解锁某些条件?