Bonjour ou bonsoir,
Un objet de la classe Java.Lang.Integer est immuable.
Disons que l'on a un objet "i" qui est une instance de cette classe avec comme paramètre passer au constructeur l'entier 0.
Il est permis de faire : i++.
Est-il possible qu'en itérant cette opération x fois, le pointeur de cet objet change pour une autre instance qui contient donc l'entier x ? Si oui, pourquoi ?
Je vous pose cette question car j'ai fais une découverte bizarre :
J'ai une classe(appelé test contenant le main) qui a notamment un static objet Integer(qui contient le chiffre 0) : Static Integer i = new Integer(0);
J'ai une classe modInt qui implémente Runnable.
Code du constructeur : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 modInt(int i) { this.thread = new Thread(this, "modInt n° " + Integer.toString(i)); this.ID = i; }
Dans mon main, je crée 3 objet modInt et je les démarre avec (new modInt(1)).thread.start(), (new modInt(2)).thread.start() et (new modInt(3)).thread.start().
Code du run() : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 for (int i = 1; i <= 200000; i++) { synchronized(test.i){ test.i++; } } System.out.println("Dernière valeur enregistré :" + test.i);
En toute logique, à la fin de l'execution des 3 objets, je devrais obtenir :
Dernière valeur enregistré : x(>0)
Dernière valeur enregistré : y(>200000)
Dernière valeur enregistré : 600000
Or je n'obtient pas 600 000. Cela veut dire qu'il y a un problème d'accès sur l'Integer i. Or j'y met un verrou dessus.
Donc soit le pointeur de i a changé et donc les modInt ne travaillent plus sur le même i ou alors je comprends pas..
Pourriez vous m'éclairer ?
Merci
Partager