Возможно ли, что уведомление ()в другом потоке вызывается раньше, чем ожидание ()в одном потоке? Это происходит со мной.
Клиент запрашивает значение у цели и ожидает переменной результата RV. Если целью является сам клиент, я обновляю RV с правильным результатом и вызываю уведомление ()для RV в другом потоке.
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(), программа не продолжает работу, так как уведомление уже было вызвано.
Как мы можем предотвратить это?