Conceptuellement, qu'est-ce que cela signifie quand on dit que chaque thread obtient sa propre pile?

10

J'ai lu Java Concurrency in Practice de Brian Goetz et à l'intérieur de la section Stack Confinement, il est mentionné que chaque thread obtient sa propre pile et que les variables locales sont intrinsèquement confinées au thread d'exécution; ils existent sur la pile de threads en cours d'exécution, qui n'est pas accessible aux autres threads. Que signifie-t-il que chaque thread a sa propre pile d'exécution?

Geek
la source
4
Pour une compréhension plus approfondie à ce sujet, recherchez le registre de pointeur de pile et comment il est utilisé dans l'assemblage. Cela expliquera comment les threads peuvent facilement avoir leur propre pile.
Peter Smith
1
D'accord avec Peter Smith. Cela peut prendre du temps, mais après, vous aurez une parfaite connaissance de ce qui se passe, comment et pourquoi
superM

Réponses:

13

Vous savez quand vous passez au débogueur pour une raison quelconque, et l'EDI vous donne une trace de pile? Et chaque méthode (cadre de pile) a son propre ensemble de variables locales que vous pouvez examiner dans le débogueur?

C'est la "pile d'exécution" de votre programme. Il montre à quoi ressemble actuellement l'état local de votre programme. Ce que l'auteur dit, c'est que chaque thread obtient sa propre pile d'exécution distincte comme ça. Il a sa propre pile d'appels et chacune des méthodes a ses propres variables locales.

Étant donné que les variables sont stockées dans le cadre de la pile d'exécution et non dans le tas, elles sont uniques au thread en cours d'exécution et ne peuvent pas être partagées directement. Vous pouvez les copier ou transmettre des références à des objets à d'autres threads de différentes manières, cependant, c'est principalement une distinction académique.

Mason Wheeler
la source
Veuillez ajouter une emphase encore plus forte à votre troisième paragraphe pour indiquer que les variables locales qui sont exposées à d'autres threads ou objets à longue durée de vie ne seront plus confinées. Ainsi, l'affirmation citée dans le livre d'OP est très douteuse.
rwong
4
@rwong: Il est impossible d'exposer une variable locale à un autre thread d'une manière qui serait problématique. Les variables contiennent uniquement des primitives ou des références. Les objets vivent sur le tas.
Michael Borgwardt
@MichaelBorgwardt Prenons deux cas séparément, disons que la variable contient une primitive qui est le cas A et que la variable contient une référence qui est le cas B. Puisque les primitives sont passées par valeur, les variables locales sont en effet thread-safe mais qu'en est-il des références. Ils peuvent être contournés? Pourquoi dites-vous que c'est impossible?
Geek
2
@Geek: Parce que la variable et l'objet auquel elle se réfère sont deux choses distinctes et différentes à ne pas confondre lorsque l'on parle à ce niveau de détail. Une variable locale ne peut pas être exposée à un thread différent. Les objets peuvent certainement.
Michael Borgwardt
@MichaelBorgwardt Je vois ce que vous dites. Merci pour la clarification.
Geek