Уведомление Java ()вызывается перед ожиданием()

Возможно ли, что уведомление ()в другом потоке вызывается раньше, чем ожидание ()в одном потоке? Это происходит со мной.

Клиент запрашивает значение у цели и ожидает переменной результата 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(), программа не продолжает работу, так как уведомление уже было вызвано.

Как мы можем предотвратить это?

5
задан Darwin 3 October 2014 в 16:04
поделиться