개념적으로 각 스레드가 자체 스택을 얻는다는 것은 무엇을 의미합니까?


10

Brian Goetz 가 실제로 Java Concurrency를 읽고 Stack Confinement 섹션 에서 각 스레드가 자체 스택을 가져 와서 로컬 변수가 본질적으로 실행중인 스레드에 국한되어 있다고 언급합니다. 그것들은 실행중인 스레드 스택에 존재하며 다른 스레드는 액세스 할 수 없습니다. 각 스레드마다 자체 실행 스택이 있다는 것은 무엇을 의미합니까?


4
이것에 대해 더 깊이 이해하려면 스택 포인터 레지스터와 그것이 어셈블리에서 어떻게 사용되는지 찾아보십시오. 스레드가 쉽게 자체 스택을 가질 수있는 방법을 설명합니다.
피터 스미스

1
피터 스미스와 동의하십시오. 시간이 걸릴 수 있지만 그 후에는 어떻게, 어떻게, 왜 진행되고 있는지에 대한 완벽한 지식을 얻게됩니다.
superM

답변:


13

어떤 이유로 든 디버거에 침입하면 IDE가 스택 추적을 제공합니까? 그리고 각 메소드 (스택 프레임)에는 디버거에서 검사 할 수있는 자체 로컬 변수 세트가 있습니까?

이것이 프로그램의 "실행 스택"입니다. 현재 프로그램의 로컬 상태를 보여줍니다. 저자가 말하는 것은 각 스레드가 이와 같은 고유 한 실행 스택을 얻는다는 것입니다. 자체 호출 스택이 있으며 각 메소드에는 자체 로컬 변수가 있습니다.

변수는 힙이 아닌 실행 스택의 일부로 저장되므로 실행중인 스레드에 고유하며 직접 공유 할 수 없습니다. 그러나 여러 가지 방법으로 객체를 복사하거나 객체에 대한 참조를 다른 스레드에 전달할 수 있으므로 대부분 학문적 차이입니다.


추가하시기 바랍니다 더 강한 되는 지역 변수는 그 상태로 세 번째 단락에 중점을 노출 다른 스레드 또는 긴 생물체에 더 이상 제한되지 않습니다. 따라서 OP의 책에서 인용 된 주장은 매우 모호합니다.
rwong

4
@ rwong : 로컬 변수를 다른 스레드에 문제가있는 방식으로 노출시키는 것은 불가능합니다. 변수에는 프리미티브 또는 참조 만 포함됩니다. 개체는 힙에 존재합니다.
Michael Borgwardt

@MichaelBorgwardt 변수에 대소 문자 A 인 프리미티브가 포함되어 있고 대소 문자 B에 대한 참조가 변수에 포함되어 있다고 두 가지 경우를 별도로 살펴 보겠습니다. 프리미티브는 값으로 전달되므로 로컬 변수는 실제로 스레드 안전하지만 참조는 어떻습니까. 그들은 통과 될 수 있습니까? 왜 불가능하다고 말합니까?
Geek

2
@Geek : 변수와 ​​변수가 참조하는 두 가지 개별적이고 다른 것들이기 때문에이 세부 수준에서 이야기 할 때 혼동해서는 안됩니다. 지역 변수는 다른 스레드에 노출 될 수 없습니다. 확실히 개체가 할 수 있습니다.
Michael Borgwardt

@MichaelBorgwardt 나는 당신이 무슨 말을하는지 알 수 있습니다.
Geek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.