Concettualmente cosa significa quando si dice che ogni thread ottiene il proprio stack?


10

Ho letto Java Concurrency in Practice di Brian Goetz e all'interno della sezione Stack Confinement si dice che ogni thread ha il suo stack e quindi le variabili locali sono intrinsecamente confinate al thread in esecuzione; esistono nello stack dei thread in esecuzione, che non è accessibile ad altri thread. Cosa significa che ogni thread ha il proprio stack di esecuzione?


4
Per una comprensione più approfondita di ciò, cercare il registro del puntatore dello stack e come viene utilizzato nell'assembly. Questo spiegherà come i thread possono facilmente avere il proprio stack.
Peter Smith,

1
D'accordo con Peter Smith. Potrebbe volerci del tempo, ma in seguito avrai una perfetta conoscenza di cosa, come e perché sta succedendo
superM

Risposte:


13

Sai quando passi al debugger per qualsiasi motivo e l'IDE ti dà una traccia dello stack? E ogni metodo (stack frame) ha il proprio set di variabili locali che è possibile esaminare nel debugger?

Questo è lo "stack di esecuzione" del tuo programma. Mostra come appare lo stato locale del programma al momento. Ciò che l'autore sta dicendo è che ogni thread ottiene il proprio stack di esecuzione distinto in questo modo. Ha il proprio stack di chiamate e ciascuno dei metodi ha le proprie variabili locali.

Poiché le variabili sono memorizzate come parte dello stack di esecuzione e non nell'heap, sono uniche per il thread in esecuzione e non possono essere condivise direttamente. Puoi copiarli o passare riferimenti ad oggetti ad altri thread in vari modi, tuttavia, questa è principalmente una distinzione accademica.


Si prega di aggiungere un'enfasi ancora più forte al terzo paragrafo per affermare che le variabili locali che sono esposte ad altri thread o oggetti di lunga durata non saranno più limitate. Pertanto, l'affermazione citata dal libro di OP è molto dubbia.
rwong

4
@rwong: è impossibile esporre una variabile locale a un altro thread in un modo che sarebbe problematico. Le variabili contengono solo primitive o riferimenti. Gli oggetti vivono nell'heap.
Michael Borgwardt,

@MichaelBorgwardt Prendiamo due casi separatamente diciamo che la variabile contiene una primitiva che è il caso A e che la variabile contiene un riferimento che è il caso B. Dal momento che le primitive vengono passate per valore, le variabili locali sono effettivamente thread-safe ma per quanto riguarda i riferimenti. Possono essere passati in giro? Perché dici che è impossibile?
Geek,

2
@Geek: Perché la variabile e l'oggetto a cui fa riferimento sono due cose separate e diverse che non devono essere confuse quando si parla a questo livello di dettaglio. Una variabile locale non può essere esposta a un thread diverso. Gli oggetti certamente possono.
Michael Borgwardt,

@MichaelBorgwardt Capisco quello che stai dicendo. Grazie per il chiarimento.
Geek,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.