Was bedeutet es konzeptionell, wenn gesagt wird, dass jeder Thread seinen eigenen Stapel erhält?

10

Ich habe Java Concurrency in Practice von Brian Goetz gelesen und im Abschnitt Stack Confinement wird erwähnt, dass jeder Thread seinen eigenen Stack erhält und daher lokale Variablen an sich auf den ausführenden Thread beschränkt sind. Sie befinden sich auf dem Stapel der ausführenden Threads, auf den andere Threads nicht zugreifen können. Was bedeutet er, dass jeder Thread seinen eigenen Ausführungsstapel hat?

Geek
quelle
4
Weitere Informationen hierzu finden Sie im Stapelzeigerregister und in der Verwendung in der Assembly. Dies erklärt, wie Threads leicht einen eigenen Stapel haben können.
Peter Smith
1
Stimmen Sie mit Peter Smith überein. Es kann
einige

Antworten:

12

Sie wissen, wann Sie aus irgendeinem Grund zum Debugger wechseln und die IDE Ihnen einen Stack-Trace gibt? Und jede Methode (Stapelrahmen) hat ihre eigenen lokalen Variablen, die Sie im Debugger untersuchen können?

Das ist der "Ausführungsstapel" Ihres Programms. Es zeigt, wie der lokale Status Ihres Programms im Moment aussieht. Was der Autor sagt, ist, dass jeder Thread so einen eigenen Ausführungsstapel bekommt. Es hat einen eigenen Aufrufstapel und jede der Methoden hat ihre eigenen lokalen Variablen.

Da die Variablen als Teil des Ausführungsstapels und nicht im Heap gespeichert werden, sind sie für den ausgeführten Thread eindeutig und können nicht direkt freigegeben werden. Sie können sie jedoch kopieren oder Verweise auf Objekte auf verschiedene Weise an andere Threads übergeben. Dies ist also meistens eine akademische Unterscheidung.

Mason Wheeler
quelle
Bitte betonen Sie Ihren dritten Absatz noch stärker, um anzugeben, dass lokale Variablen, die anderen Threads oder langlebigen Objekten ausgesetzt sind , nicht länger eingeschränkt werden. Daher ist die aus dem Buch von OP zitierte Behauptung sehr zweifelhaft.
Rwong
4
@rwong: Es ist unmöglich, eine lokale Variable auf eine problematische Weise einem anderen Thread auszusetzen. Variablen enthalten nur Grundelemente oder Referenzen. Objekte leben auf dem Haufen.
Michael Borgwardt
@MichaelBorgwardt Nehmen wir zwei Fälle getrennt an, sagen wir, die Variable enthält ein Grundelement, das Fall A ist, und sagen wir, die Variable enthält eine Referenz, die Fall B ist. Da Grundelemente als Wert übergeben werden, sind die lokalen Variablen zwar threadsicher, aber was ist mit Referenzen? Sie können herumgereicht werden? Warum sagst du, ist es unmöglich?
Geek
2
@Geek: Da die Variable und das Objekt, auf das sie sich bezieht, zwei separate und unterschiedliche Dinge sind, die nicht verwechselt werden sollten, wenn auf dieser Detailebene gesprochen wird. Eine lokale Variable kann keinem anderen Thread ausgesetzt werden. Objekte können sicherlich.
Michael Borgwardt
@ MichaelBorgwardt Ich verstehe, was Sie sagen. Danke für die Klarstellung.
Geek