Rappel sur le modèle de mémoire Java
Avant de pouvoir découvrir comment écrire des applications concurrentes en Java, il faut vous rappeler comment fonctionne un programme séquentiel et comment est gérée la mémoire en Java. On va donc rapidement revoir les différents concepts qui ont été vus dans le chapitre 6 du tutoriel principal.
Environnement, tas et pile
Il y a donc trois entités en mémoire : des environnements, une pile et un tas. À tout moment, une méthode est en cours d'exécution dans le programme. À cette méthode est associé un environnement qui va contenir toutes les variables locales à la méthode et la référence this pour les méthodes d'instance. Il y a ensuite le tas qui va contenir toutes les instances des objets créées dans le programme. Ce dernier est unique, contrairement aux environnements qui existeront pour chaque méthode en cours d'exécution. Lorsqu'une méthode appelle une autre, un nouvel environnement va donc être créé pour la méthode appelée tandis que l'ancien doit être conservé pour être à nouveau utilisé lorsque le contrôle reviendra à la méthode appelante. Il y a donc une pile d'environnements qui permet de gérer les appels de méthode.
Prenons un exemple pour se remémorer ces différentes entités de la mémoire :
|
|
Regardons ce programme un peu plus en détails. La première instruction exécutée se trouve à la ligne 12, il s'agit de la déclaration d'une nouvelle variable t de type int[], de la création d'un nouvel objet de type int[] représentant un tableau à trois éléments qui sont dans l'ordre 1, 2 et 3 et enfin de l'affectation d'une référence vers cet objet dans la variable t. La figure suivante montre l'état de la mémoire après exécution de cette instruction.

On peut donc voir qu'il y a un environnement sur la pile (pour la méthode main) et qu'il ne contient d'une seule variable (la variable t). Cette dernière contient une référence vers un objet qui se trouve dans le tas et qui correspond au tableau {1, 2, 3}.
L'exécution du programme continue et l'instruction suivante (ligne 13) est un appel de méthode. Un nouvel environnement va être créé pour la méthode et le contrôle va être transféré à la première instruction du corps de la méthode appelée, à savoir l'instruction de la ligne 5. La figure suivante montre l'état du programme après exécution des instructions de la ligne 13 et de la ligne 5.

On voit donc clairement qu'un nouvel environnement a été ajouté au-dessus de la pile. Cet environnement contient tout d'abord les différents paramètres formels de la méthode appelée, à savoir les variables t, i et j. Ces variables sont initialisées avec les valeurs des paramètres réels fournit lors de l'appel en ligne 13 : la variable t contient une référence vers le tableau {1, 2, 3} situé dans le tas et les variables i et j sont respectivement initialisées à 2 et 1. Ensuite, la première instruction de la méthode swap est exécutée, ce qui crée une nouvelle variable locale x initialisée à la valeur de t[2], à savoir 3.
Bloc de code
Pour être complet, il ne faut pas oublier de mentionner les blocs de code qui permettent d'avoir des variables dont la portée est plus limitée qu'au corps de la méthode. En effet, ces variables n'existent que depuis leur déclaration jusqu'à la fin du bloc la contenant. L'exemple typique sont les variables déclarées dans la partie déclaration des boucles for.
Les environnement sont donc des structures plus complexes que ce qu'on a vu juste ci-dessus, mais on n'a pas besoin d'aller jusqu'à ce niveau de détails pour la discussion qui nous intéresse dans le cadre de ce tutoriel.





















