Уведомлять потоки при изменении счетчика

Я пытаюсь разработать класс как Code Kata для себя, который имеет свойство value, которое можно установить, и класс может выдавать экземпляры ValueListener. Идея состоит в том, что существует один экземпляр ValueHolder, к которому одновременно обращается множество клиентских потоков. Каждый клиентский поток запросил ValueWatcher и вызвал функцию waitForValue().

Что меня действительно мучает, так это то, какое условие я должен использовать в цикле while вокруг wait(), чтобы избежать ложных уведомлений (т. е. значение не изменилось). Я вижу, что такой дизайн позволяет экземплярам ValueWatcher пропускать обновления, но на данном этапе меня это меньше беспокоит.

Буду признателен за любые предложения!

public class ValueHolder {

  private int value = 0;
  private final Object monitor = new Object();

  public void setValue(int value) {
    synchronized(monitor) {
      this.value = value;
      monitor.notifyAll();
    }
  }

  ValueWatcher createChangeWatcher() {
    return new ValueWatcher();
  }

  private class ValueWatcher {
    public int waitForValue() {
      synchronized(monitor) {
        while (==== ??? =====) {
          monitor.wait();
          return value;
        }
      }
    }
  }     
}
6
задан Scruffers 6 March 2012 в 22:32
поделиться