Bonjour, voila j'utilise depuis trop longtemps les threads sans vraiment connaitre les mécanismes, je voudrais donc clarifier certaine chose.

Tout d'abord, le bloc synchronized.
J'ai le code suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
int i;
int j;
 
public void a() {
   synchronized(this) {
   i++;
   }
   j++;
}
 
public void b() {
   synchronized(this) {
   j++
   i++;
   }
}
En effectuant ceci, cela veut bien dire que si un thread T1 appelle la méthode la méthode b, alors un thread T2 ne pourra pas réaliser le bloc synchronized de la méthode a (ou b) tant que le bloc synchronized appelé par T1 n'est pas terminé. Exacte ?

Maintenant, si c'était la méthode a qui a était appelée par T1, vu que le bloc synchronized ne comprend pas l'instruction "j++", est ce que T2 peut commencer le bloc synchronized de la méthode b pour faire l'instruction j++ ?

Ensuite, quand on fait synchronised (xxx). xxx correspond au mutex. Mais au final, je ne comprend pas réellement ce que cela fait.

Enfin, questions sur wait et notify :
Si je fais un wait sur un thread cela va l'endormir, mais que ce passe il si je fais un wait sur un objet ? Cela va "endormir" tous les threads qui utilisent cet objet ? (et je suppose que la réponse sera la mêem pour le notify)

J'ai cru comprendre que si je faisais un wait sur un objet, rien ne m'assure qu'il ne va pas être réveillé par le scheduler sans que je ne fasse un notify. Est ce exacte ?

Pourquoi est ce que si je fais un this.wait, ou même un obj.wait, j'aurais un illegaleMonitorStateException si je n'encapsule pas le tout dans un bloc synchonized ?

Voila, comme vous pouvez voir, il y' a pas mal de chose que je ne maitrise pas bien ^^