2016-09-13 3 views
1

この質問を読んでいました Static method behavior in multi-threaded environment in java
しかし、この質問はマルチコアプロセッサ環境には、同じ与えられた時間同じ方法を実行することができ、マルチスレッドに答えていませんでした。
私のタイトルの質問が「はい」の場合、私のコンピュータはこれをどのように正確に実装していますか?呼び出されるのを待っているスタティックメソッドが1つしかないためです。
2つのコアはそれぞれ、その静的メソッドをコアのラムにコピーし、同時に実行しますか?
私は明確にその点を表現しているかどうかわかりません。もしそうでなければ、私はそれを説明する以上に喜んでいる。ありがとうございました。マルチコアプロセッサ環境では、同時に同じ静的メソッドを実行する複数のスレッドがある可能性があります

+0

マルチコアであっても、これは同じRAMです。あなたの質問への答えはあなたが参照しているものと同じです。 –

答えて

8

コードを独立して実行するために必要なすべての情報は、スレッドにローカルに格納されます。コアがメソッドを実行するとき、スレッドのコンテキストでそれが実行されます。実際の実行可能コードは変更できません(書き込み可能ではありません)ので、どこにでもコピーする必要はありません。スレッド/コア間で共有することができます。

メソッドはローカル変数を持つことができます。これらは、スレッドのプロパティであるスタックに格納されます。各スレッドはそのスタックのために別々のメモリを持っているので、各コアはローカル変数の異なるメモリにアクセスします。

ヒープに関するデータの場合、これは共有されているため、マルチスレッド環境では、アクセスを調整することによってアクセスする際に注意が必要です(たとえば、​​を使用)。

静的であるか静的でないかは関係ありません。どちらの場合でも、コードのコピーは1つだけです。非静的メソッドはオブジェクトの複数のインスタンスを持つことができます(したがって、異なるコアが異なるヒープデータにアクセスする可能性があります)。静的メソッドは静的データにアクセスします(共有され、 。

実行可能コードを実行のためにローカルキャッシュにコピーすることがありますが、パフォーマンス上の理由で実行されますが、共有可能性に関する問題のためではありません。

クイック回答:はい。

+0

私はどのような方法が間違っているかのように見えます。したがって、スレッドが作成されると、静的メソッドのすべてのコンテキストがそれ自体に格納されます。その後、そのスレッドがそのメソッドを実行しているとき、すでにそれ自体に格納されているコンテキストを実行しますか?あれは正しいですか? –

+1

はい - スレッドはコンテキストを保持します。つまり、静的メソッドとインスタンス・メソッドの両方でローカル変数のコードと値に入っている場所です。他のすべてはヒープにあります。静的メソッドとインスタンスメソッドの唯一の違いは、インスタンスメソッドはオブジェクトのメンバーにアクセスでき、静的メソッドはオブジェクトのメンバーにアクセスできないことです。インスタンスメソッドはオブジェクトごとに存在するように見えるので混乱しますが、実際にはオブジェクトに存在するのはデータだけです。コードのコピーは1つだけです。 – rghome

1

シングルプロセスでマルチスレッドを使用している場合は、スレッド優先度に基づいて2つのスレッドが静的メソッドを実行します。しかし、マルチプロセッサのマルチスレッド環境について話している場合は、同じ時間に同じ静的メソッドまたは非静的メソッドをマルチコアプロセッサ環境で実行できます。各プロセスは異なるJVM環境で実行されるためです。

1

短い答え、はい可能です。

各メソッド呼び出しは独自のスタックを取得し、並列実行できます。

呼び出される静的メソッドは、単なる実行可能ステートメントのセットです。スレッドはメソッドロジックに書き込むことができないため、各スレッドは同じ命令セットを参照します。また、命令から実行する行を指示するポインタ(sort of)もあります。

クラス/オブジェクトの観点から考えてみましょう。同じクラスのすべてのオブジェクトは同じコードベースを共有しますが、2つのオブジェクトを同時に作成できないことを意味しますか?

インスタンスは同じオブジェクトを参照していますが、別のインスタンスとは異なります。

同じように、2つのメソッド呼び出しは同じ命令セットを参照しますが、データは異なります(これらの命令はどちらの命令か、ローカル変数の値など)。

私はあなたの混乱は、メソッドが静的であるためだと思います(したがって、あなたの前提は、1つだけのコピー)。コピーは同じままです。メソッドが呼び出されるたびに、命令をコピーする必要があります。命令とデータを区別すると、それが役に立ちます。

関連する問題