【发布时间】:2016-10-08 13:05:44
【问题描述】:
我有一个对象:
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;
}
}
我想停止线程“一”,直到线程“二”将变量“已处理”更改为真。在“已处理”设置为 true 后,我想唤醒线程“一”并继续做一些事情。
我知道我们可以使用 wait 和 notify 方法来组织它,但是因为中断很危险。
如果我只使用等待和通知方法,则可能会出现无限等待的情况。
如果我们的等待方法因某种原因被中断,我们检查“进程”变量是否仍然为假,之后我们可以再次使用等待,如下所示:
while(true){
if(!resource.isProcessed()){
resource.getLock().wait();
}
else{
break;
}
}
使用这样的代码是危险的,因为在我们检查“!resource.isProcessed()”之后,在我们使用“resource.getLock().wait()”之前,另一个进程可以将“进程”设置为true,并且调用“resource.getLock().notify()”(不会生效,因为我们还没有调用“wait()”)。
如何安全地等待某个条件?如何安全地通知/解锁某些情况?
【问题讨论】:
-
我建议你等待一个条件 docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/… 以 Javadoc 为例。
标签: java multithreading thread-safety locking wait