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


10

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


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

1
Согласитесь с Питером Смитом. Это может занять
— некоторое

Ответы:


13

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

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

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


Пожалуйста, добавьте еще больший акцент в ваш третий абзац, чтобы утверждать, что локальные переменные, которые выставлены другим потокам или долгоживущим объектам, больше не будут ограничены. Таким образом, утверждение, приведенное в книге О.П., очень сомнительно.
— Рулон

4
@ rwong: Невозможно представить локальную переменную другому потоку таким образом, чтобы это было проблематично. Переменные содержат только примитивы или ссылки. Объекты живут в куче.
— Майкл Боргвардт

@MichaelBorgwardt Давайте возьмем два случая отдельно, скажем, переменная содержит примитив, который является случаем A, и скажем, что переменная содержит ссылку, которая является случаем B. Поскольку примитивы передаются по значению, локальные переменные действительно потокобезопасны, но как насчет ссылок. Их можно обойти? Почему вы говорите, что это невозможно?
— Компьютерщик

2
@ Geek: потому что переменная и объект, на который она ссылается, - это две разные вещи, которые не следует путать при разговоре на этом уровне детализации. Локальная переменная не может быть представлена ​​другому потоку. Объекты конечно могут.
— Майкл Боргвардт

@MichaelBorgwardt Я понимаю, что вы говорите. Спасибо за разъяснения.
— Компьютерщик
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.