Je suis tombé sur le code suivant dans un article quelque part sur Internet :
public class MyInt {
private int x;
public MyInt(int y) {
this.x = y;
}
public int getValue() {
return this.x;
}
}
L'article précise que
Les constructeurs ne font pas l'objet d'un traitement spécial par le compilateur (JIT, CPU, etc.). Il est donc permis de réordonner les instructions du constructeur et les instructions qui viennent après le constructeur.
Aussi, cet article de la JSR-133 sur le modèle de mémoire Java indique que
Un thread qui ne peut voir une référence à un objet qu'après que cet objet ait été complètement initialisé est assuré de voir les valeurs correctement initialisées pour les champs finaux de cet objet.
L'article susmentionné MyInt
semble immuable (sauf que la classe n'est pas marquée final
) et thread-safe, mais les articles indiquent qu'il ne l'est pas. Ils indiquent qu'il n'est pas garanti que x
a toujours la valeur correcte à la lecture.
Mais je pensais que
seul le thread qui crée un objet doit y avoir accès pendant sa construction.
et le Tutoriels Java semblent soutenir cela.
Ma question est la suivante : cela signifie-t-il qu'avec la JMM actuelle, un thread peut avoir accès à un objet partiellement construit en raison du réordonnancement des instructions ? Et si oui, comment ? Et cela signifie-t-il que l'affirmation des Tutoriels Java est tout simplement fausse ?