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?

Nerd
fonte
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.

Mason Wheeler
fonte
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