Conceitualmente, o que significa quando se diz que cada thread recebe sua própria pilha?


10

Eu tenho lido Java Concurrency in Practice por Brian Goetz e, na seção Stack Confinement , é mencionado que cada thread obtém sua própria pilha e, portanto, as variáveis ​​locais são intrinsecamente confinadas ao thread em execução; eles existem na pilha de threads em execução, que não é acessível para outros threads. O que ele quer dizer com cada thread com sua própria pilha de execução?


4
Para um entendimento mais profundo sobre isso, procure o registro do ponteiro da pilha e como ele é usado na montagem. Isso explicará como os threads podem facilmente ter sua própria pilha.
— Peter Smith

11
Concordo com Peter Smith. Pode levar tempo, mas depois que você começa conhecimento perfeito de que, como e por que está acontecendo
— SuperM

Respostas:


13

Você sabe quando você entra no depurador por qualquer motivo, e o IDE fornece um rastreamento de pilha? E cada método (quadro de pilha) tem seu próprio conjunto de variáveis ​​locais que você pode examinar no depurador?

Essa é a "pilha de execução" do seu programa. Ele mostra como é o estado local do seu programa no momento. O que o autor está dizendo é que cada thread recebe sua própria pilha de execução distinta como essa. Ele possui sua própria pilha de chamadas e cada um dos métodos possui suas próprias variáveis ​​locais.

Como as variáveis ​​são armazenadas como parte da pilha de execução e não na pilha, elas são exclusivas do encadeamento que está sendo executado e não podem ser compartilhadas diretamente. Você pode copiá-los ou passar referências a objetos para outros threads de várias maneiras, portanto, essa é principalmente uma distinção acadêmica.


Adicione uma ênfase ainda mais forte ao seu terceiro parágrafo para declarar que variáveis ​​locais expostas a outros threads ou objetos de vida longa não serão mais confinadas. Assim, a alegação citada no livro da OP é muito duvidosa.
— rwong 31/07/12

4
@ rwong: É impossível expor uma variável local para outro segmento de uma maneira que seria problemática. Variáveis ​​contêm apenas primitivas ou referências. Objetos vivem na pilha.
— Michael Borgwardt

@MichaelBorgwardt Vamos considerar dois casos separadamente, digamos que a variável contém uma primitiva que é o caso A e digamos que a variável contém uma referência que é o caso B. Como as primitivas são passadas por valor, as variáveis ​​locais são de fato seguras para threads, mas e as referências. Eles podem ser passados? Por que você diz que é impossível?
— 31712 Geek

2
@ Geek: Porque a variável e o objeto a que se refere são duas coisas distintas e diferentes que não devem ser confundidas quando se fala nesse nível de detalhe. Uma variável local não pode ser exposta a um encadeamento diferente. Objetos certamente podem.
— Michael Borgwardt

@MichaelBorgwardt Entendo o que você está dizendo. Obrigado pelo esclarecimento.
— 31712 Geek
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.