Koncepcyjnie, co to znaczy, kiedy mówi się, że każdy wątek ma swój własny stos?


10

Czytałem Java Concurrency in Practice autorstwa Briana Goetza i wewnątrz sekcji Stack Coninement wspomniano, że każdy wątek otrzymuje swój własny stos, a więc zmienne lokalne są wewnętrznie ograniczone do wątku wykonującego; istnieją na stosie wątków wykonawczych, który nie jest dostępny dla innych wątków. Co on oznacza, że ​​każdy wątek ma swój własny stos wykonywania?


4
Aby lepiej to zrozumieć, sprawdź rejestr wskaźnika stosu i sposób jego użycia w asemblerze. To wyjaśni, jak wątki mogą łatwo mieć swój własny stos.
Peter Smith,

1
Zgadzam się z Peterem Smithem. Może to zająć trochę czasu, ale potem doskonale wiesz, co, jak i dlaczego się dzieje
superM

Odpowiedzi:


13

Wiesz, kiedy z jakiegoś powodu włamujesz się do debuggera, a IDE daje ślad stosu? I każda metoda (ramka stosu) ma swój własny zestaw zmiennych lokalnych, które można sprawdzić w debuggerze?

To jest „stos wykonania” twojego programu. Pokazuje, jak obecnie wygląda lokalny stan twojego programu. Autor mówi, że każdy wątek otrzymuje swój własny odrębny stos wykonawczy w ten sposób. Ma własny stos wywołań, a każda z metod ma własne zmienne lokalne.

Ponieważ zmienne są przechowywane jako część stosu wykonawczego, a nie w stercie, są one unikalne dla uruchamianego wątku i nie można ich udostępniać bezpośrednio. Możesz je jednak kopiować lub przekazywać odniesienia do obiektów do innych wątków na różne sposoby, więc jest to w większości akademickie rozróżnienie.


Dodaj jeszcze silniejszy nacisk do trzeciego akapitu, aby stwierdzić, że zmienne lokalne, które są narażone na inne wątki lub obiekty o długim czasie życia, nie będą już ograniczone. Zatem twierdzenie cytowane z książki OP jest bardzo wątpliwe.
rwong

4
@rwong: Niemożliwe jest udostępnienie zmiennej lokalnej innemu wątkowi w sposób, który byłby problematyczny. Zmienne zawierają tylko prymitywy lub odwołania. Obiekty żyją na stercie.
Michael Borgwardt

@ MichaelBorgwardt Weźmy dwa przypadki osobno, powiedzmy, że zmienna zawiera prymityw, którym jest przypadek A, i powiedzmy, że zmienna zawiera odwołanie, które jest przypadkiem B. Ponieważ prymitywy są przekazywane przez wartość, zmienne lokalne są rzeczywiście bezpieczne dla wątków, ale co z odniesieniami. Można je przekazywać? Dlaczego mówisz, że to niemożliwe?
Geek

2
@Geek: Ponieważ zmienna i obiekt, do którego się odnosi, to dwie odrębne i różne rzeczy, których nie należy mylić, mówiąc na tym poziomie szczegółowości. Zmienna lokalna nie może być wystawiona na inny wątek. Przedmioty z pewnością mogą.
Michael Borgwardt

@MichaelBorgwardt Rozumiem, co mówisz. Dzięki za wyjaśnienie.
Geek
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.