Sto provando a progettare una classe come codice Kata per me che ha una proprietà valore che può essere impostata e la classe può emettere istanze ValueListener. L'idea è che esiste un'istanza di ValueHolder con molti thread client che accedono contemporaneamente. Ogni thread client ha richiesto un ValueWatcher e ha chiamato waitForValue().Notifica thread in caso di modifiche contatore
Quello con cui sto davvero combattendo è quale condizione dovrei usare nel ciclo while attorno all'attesa() per evitare notifiche spurie (cioè il valore non è cambiato). Vedo che questo design può rendere possibile che le istanze di ValueWatcher perdano gli aggiornamenti, ma in questo momento sono meno preoccupato di ciò.
Apprezzerebbero qualsiasi guida in offerta!
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;
}
}
}
}
}
Stai vedendo notifiche spurie? Se solo il programma di aggiornamento chiama 'notify' o' notifyall', allora non vedo come saresti. – Gray
Potrebbe essere che la chiamata 'setValue' dovrebbe solo 'notificare' altri se il' valore' è effettivamente cambiato? In questo momento potrebbe essere aggiornato con lo stesso valore e tutti verranno avvisati. E 'questo quello che vuoi? – Gray
Non vedo perché sia necessario un ciclo 'while'. – biziclop