Bien que j'ai écrit un tutoriel sur la synchronisation en Java, il reste des petites questions auxquelles je n'ai pas de réponse (et dont je ne parle évidemment pas dans le tutoriel, à la limite on peut s'en passer).
Ma question pourrait se résumer à ceci (où s est une variable partagée entre 2 threads) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 //Thread 1 s = "abc";Le fait que ça soit un String n'a aucune importance, ma question concerne l'affectation d'un Object (pas d'un type primitif) à une variable.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 //Thread 2 s = "def";
Est-ce qu'une affectation d'objet a besoin d'être synchronisée?
Vous me direz, dans le doute, autant le faire. Mais justement, je veux lever le doute.
Pöurquoi ma question concerne uniquement les Object et non les types primitifs? Tout simplement parce que si c'est un long ou un double, par exemple, on ne peut pas se passer de la synchronisation (l'affectation change les 32 bits de poids forts, puis les 32 bits de poids faible -ou le contraire, peu importe-).
Mais à priori, l'implantation des références est un int, non?
Faut-il en plus ajouter "volatile"? Est-ce nécessaire? Est-ce suffisant?
Et, si la réponse est "non, pas besoin de synchronisation", est-ce vrai aussi pour les multiprocesseurs?
Enfin, est-ce que cela peut poser d'autres problèmes de ne pas synchroniser une affectation d'objets, par exemple par une réorganisation d'écritures / lectures par le compilateur?
Partager