概念的には、各スレッドが独自のスタックを取得すると言われているのはどういう意味ですか?


10

私が読んでてきたブライアン・ゲッツにより、実際にJavaの並行処理を し、セクション内のスタック閉じ込め、各スレッドは独自のスタックを取得し、そのローカル変数は、本質的に実行中のスレッドに限られていることを述べています。これらは実行中のスレッドスタックに存在し、他のスレッドからはアクセスできません。各スレッドが独自の実行スタックを持っているとはどういう意味ですか?


4
これをより深く理解するには、スタックポインタレジスタと、それがアセンブリでどのように使用されるかを調べてください。これは、スレッドが簡単に独自のスタックを持つ方法を説明します。
ピーター・スミス

1
ピーター・スミスに同意します。どのように、なぜ起こっている、それは時間がかかるかもしれませんが、その後、あなたは何の完璧な知識を得る
superM

回答:


13

なんらかの理由でデバッガーにアクセスすると、IDEがスタックトレースを提供することを知っていますか?そして、各メソッド(スタックフレーム)には、デバッガーで確認できる独自のローカル変数のセットがありますか?

それがプログラムの「実行スタック」です。これは、現在のプログラムのローカルの状態を示しています。著者が言っているのは、各スレッドがそのような独自の実行スタックを取得するということです。独自のコールスタックがあり、各メソッドには独自のローカル変数があります。

変数はヒープではなく実行スタックの一部として保存されるため、実行中のスレッドに固有であり、直接共有することはできません。それらをコピーしたり、オブジェクトへの参照をさまざまな方法で他のスレッドに渡したりすることができますが、これは主に学術的な違いです。


追加してくださいさらに強くしているローカル変数という状態にあなたの第三段落に重点を暴露他のスレッドや長寿のオブジェクトにはもはや限られます。したがって、OPの本から引用された主張は非常に疑わしいものです。
rwong 2012

4
@rwong:問題となるような方法でローカル変数を別のスレッドに公開することは不可能です。変数には、プリミティブまたは参照のみが含まれます。オブジェクトはヒープ上に存在します。
Michael Borgwardt

@MichaelBorgwardt変数にケースAのプリミティブが含まれていることと、変数にケースBの参照が含まれていることを2つのケースに分けて考えてみましょう。プリミティブは値で渡されるため、ローカル変数は確かにスレッドセーフですが、参照についてはどうでしょうか。彼らは渡ることができますか?なぜそれは不可能だと言うのですか?
オタク

2
@Geek:変数とそれが参照するオブジェクトは2つの別個の異なるものであるため、この詳細レベルで話すときに混乱しないでください。ローカル変数を別のスレッドに公開することはできません。オブジェクトは確かにできます。
Michael Borgwardt

@MichaelBorgwardt私はあなたが言っていることを見ます。
オタク2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.