Je suis étudiant pour un examen d'un livre donné par mon professeur et il y a ce code qui travaille avec Threads et Synchronization: Nous voulons être notifié chaque fois que l'état change (sans manquer un changement d'état).Code avec notify et notifyAll/synchronisation (Aide à comprendre)
public class C {
private int state = 0; // the state
private boolean modified = false; // to show if the state was changed since actualization
public synchronized void printNewState() {
while (true) {
if (!modified) {
wait();
}
System.out.println(state);
modified = false;
notify();
}
}
public synchronized void setValue(int v) {
if (modified) {
wait();
}
state = v;
notify();
modified = true;
System.out.println("value set");
}
}
Et alors il est écrit:
Cependant, il n'est pas garanti pour la notification() dans la méthode SetValue (int) se réveille le fil printNewState! En Java, nous résoudre ce problème avec l'aide de notifyAll() et prendre un peu d'attente occupé:
public synchronized void printNewState() {
while (true) {
while (!modified) {
wait();
}
System.out.println(state);
modified = false;
**notify();** \\(?)
}
}
public synchronized void setValue(int v) {
while (modified) {
wait();
}
state = v;
notifyAll();
modified = true;
System.out.println("value set");
}
Je ne comprends pas pourquoi le notify n'a pas été aussi changé à notifyAll()? Il ne peut pas être garanti que cette notification va à un thread de setValue (int) ???
Merci
salut Grexis, j'ai édité la question, désolé à ce sujet. Je suis intéressé par votre réponse tho. – ovoxo
@ovoxo, voir mon édition. tl; dr le 'notify()' au lieu de 'notifyAll()' est logique tant que vous êtes sûr que seuls les threads de mise à jour sont en attente. – Grexis
merci beaucoup pour votre réponse, cela m'a beaucoup aidé :) – ovoxo