public class Main2 {
public static void main(String[] args) {
new Test2().start();
new Test2().start();
}
}
class Test2 extends Thread {
@Override
synchronized public void run() {
try {
System.out.println("begin wait");
wait();
} catch (Exception ex) {
}
}
}
Comme le résultat réel de l'exécution du test: commencer attente, commencent attente, deux fois des deux fils. Contrairement au résultat attendu: commencer attendre, une seule fois de l'un des deux threads car wait() est appelée dans la méthode run() synchronisée. Pourquoi appeler la synchronisation de thread wait() de Object?Appel à l'attente() Java Object casse la synchronisation des threads
Ça fait beaucoup!
public class Main3 {
public static void main(String[] args) {
Test3 t = new Test3();
new Thread(t).start();
new Thread(t).start();
}
}
class Test3 implements Runnable {
synchronized public void run() {
try {
System.out.println("begin wait");
wait();
} catch (Exception ex) {
}
}
}
@akf & @Sean Owen
Merci pour vos réponses. Désolé pour mon erreur, maintenant j'ai modifié le code pour placer la synchronisation sur le même objet(), le résultat est resté: commencer attendre, commencer attendre, deux fois.
@akf
attente libérera le verrou qui Synchronize a saisi, et sera re-une fois obtenu le fil est informé.
Pourriez-vous élaborer un peu?
Merci pour l'exemple et la référence javadoc! – sof
Il peut être bon de noter que le choix du thread à réveiller est arbitraire. Une bonne implémentation sera juste et notifiera les threads dans l'ordre appelé wait(), mais ce n'est pas obligatoire. La seule contrainte est donc que [N]. l'étape 1' arrive avant '[N]. étape 2', où N est toujours 1 ou 2. –
@ Mark Peters, c'est un bon point à faire - même si cela peut ne pas sembler arbitraire (par exemple, des preuves empiriques pourraient essayer de vous convaincre qu'il est ordonné), n'est aucune garantie. – akf