Я пытаюсь разработать класс как 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;
}
}
}
}
}