Концептуально що це означає, коли кажуть, що кожна нитка отримує свій стек?


10

Я читав Java Concurrency в практиці Брайана Геца, і всередині розділу Staff Confinement зазначається, що кожен потік отримує власний стек, і тому локальні змінні суттєво обмежуються виконавчим потоком; вони існують у виконанні стека потоків, який недоступний для інших потоків. Що він означає, що кожен потік має свій стек виконання?


4
Для більш глибокого розуміння цього питання знайдіть реєстр покажчиків стека та спосіб його використання при складанні. Це пояснить, як нитки можуть легко мати власний стек.
Пітер Сміт

1
Погодьтеся з Пітером Смітом. Це може зайняти час, але згодом ви отримаєте досконалі знання про те, що, як і навіщо відбувається
superM

Відповіді:


13

Ви знаєте, коли з будь-якої причини ви переходите до налагоджувача, і IDE дає вам стежку стека? І кожен метод (фрейм стека) має свій набір локальних змінних, які ви можете вивчити в налагоджувальній машині?

Це "стек виконання" вашої програми. Він показує, як виглядає місцевий стан вашої програми на даний момент. Автор говорить, що кожен потік отримує такий свій власний стек виконання. У нього є власний стек викликів, і кожен з методів має свої локальні змінні.

Оскільки змінні зберігаються як частина стека виконання, а не в купі, вони є унікальними для потоку, який запускається, і не може бути переданий безпосередньо. Ви можете скопіювати їх або передавати посилання на об’єкти в інші потоки різними способами, тому це здебільшого академічна відмінність.


Будь ласка, додайте ще більш сильний акцент до третього абзацу, щоб сказати, що локальні змінні, які піддаються впливу інших потоків або довгоживучих об'єктів, більше не обмежуватимуться. Таким чином, позов, цитований з книги ОП, є дуже сумнівним.
rwong

4
@rwong: Неможливо відкрити локальну змінну іншим потоком у спосіб, який був би проблематичним. Змінні містять лише примітиви або посилання. Об'єкти живуть на купі.
Майкл Боргвардт

@MichaelBorgwardt Давайте візьмемо два випадки окремо: скажімо, що змінна містить примітив, що є випадком A, і скажімо, що змінна містить посилання, яке є випадком B. Оскільки примітиви передаються за значенням, локальні змінні дійсно є безпечними для потоків, але що стосується посилань. Їх можна пропустити навколо? Чому ти кажеш, що це неможливо?
Geek

2
@Geek: Оскільки змінна та об'єкт, на який вона посилається, є двома окремими і різними речами, які не слід плутати, коли говорити на цьому рівні деталізації. Локальна змінна не може бути опромінена іншим потоком. Об'єкти, безумовно, можуть.
Майкл Боргвардт

@MichaelBorgwardt Я бачу, що ви говорите. Дякую за уточнення.
Geek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.