Концептуально, что это значит, когда говорится, что каждый поток получает свой собственный стек?

10

Я читал Java Concurrency in Practice от Brian Goetz, и в разделе Confinement Stack упоминается, что каждый поток получает свой собственный стек, и поэтому локальные переменные внутренне ограничены исполняющим потоком; они существуют в стеке исполняющих потоков, который недоступен другим потокам. Что он имеет в виду, что каждый поток имеет свой собственный стек выполнения?

Фанат
источник
4
Для более глубокого понимания этого, посмотрите регистр указателя стека и то, как он используется в сборке. Это объяснит, как потоки могут легко иметь свой собственный стек.
Питер Смит
1
Согласитесь с Питером Смитом. Это может занять
некоторое

Ответы:

13

Вы знаете, когда по какой-то причине вы переходите к отладчику, и IDE дает вам трассировку стека? И каждый метод (стековый фрейм) имеет свой собственный набор локальных переменных, которые вы можете проверить в отладчике?

Это «стек выполнения» вашей программы. Он показывает, как выглядит локальное состояние вашей программы в данный момент. Автор говорит, что каждый поток получает свой собственный отдельный стек выполнения, подобный этому. Он имеет свой собственный стек вызовов, и каждый из методов имеет свои локальные переменные.

Поскольку переменные хранятся как часть стека выполнения, а не в куче, они уникальны для выполняемого потока и не могут использоваться напрямую. Однако вы можете копировать их или передавать ссылки на объекты в другие потоки различными способами, так что это в основном академическое различие.

Мейсон Уилер
источник
Пожалуйста, добавьте еще больший акцент в ваш третий абзац, чтобы утверждать, что локальные переменные, которые выставлены другим потокам или долгоживущим объектам, больше не будут ограничены. Таким образом, утверждение, приведенное в книге О.П., очень сомнительно.
Рулон
4
@ rwong: Невозможно представить локальную переменную другому потоку таким образом, чтобы это было проблематично. Переменные содержат только примитивы или ссылки. Объекты живут в куче.
Майкл Боргвардт
@MichaelBorgwardt Давайте возьмем два случая отдельно, скажем, переменная содержит примитив, который является случаем A, и скажем, что переменная содержит ссылку, которая является случаем B. Поскольку примитивы передаются по значению, локальные переменные действительно потокобезопасны, но как насчет ссылок. Их можно обойти? Почему вы говорите, что это невозможно?
Компьютерщик
2
@ Geek: потому что переменная и объект, на который она ссылается, - это две разные вещи, которые не следует путать при разговоре на этом уровне детализации. Локальная переменная не может быть представлена ​​другому потоку. Объекты конечно могут.
Майкл Боргвардт
@MichaelBorgwardt Я понимаю, что вы говорите. Спасибо за разъяснения.
Компьютерщик