在一个线程中的 wait() 之前调用另一个线程中的 notify() 是否可能?它发生在我身上。
客户端从目标请求一个值并等待结果变量 RV。如果目标是客户端本身,我会使用正确的结果更新 RV,并在另一个线程中调用 RV 上的 notify()。
class EMU {
ResultVar RV;
Address my_address;
ResultVar findValue(String key) {
String tgt = findTarget(key);
sendRequest(tgt, key);
synchronized(RV) {
RV.wait();
}
return RV;
}
Runnable Server = new Runnable() {
public void run() {
//code to receive connections. Assume object of type Request is read from the stream.
Request r = (Request) ois.readObject();
if(r.requesterAddr.compareTo(my_address) == 0) {
String val = findVal(key);
RV.putVal(val);
synchronized(RV){
RV.notify();
}
}
}
};
}
问题是,在请求者完成与自己的所有“联网”(上例中的 sendReqest)之前,结果会在结果变量中更新。当请求者线程现在调用 wait() 时,程序不会继续,因为已经调用了 notify。
我们该如何预防呢?