単一のオブジェクトの共通メソッドの同時呼び出し
866 ワード
まず、javaのメモリの状況を明らかにします.以下のようにします.これは一般的に知られています.
1:heap、スタックメモリ、新しく作成したクラスオブジェクトを格納するために使用されます.実は、オブジェクトのメンバー変数値、変数タイプ、オブジェクトタイプタグを格納します.
2:stack、スタックメモリ、ローカル変数、オブジェクトへの参照などを格納します.
3:data segment、データ領域、この領域には主に静的定数と文字列定数が格納されます.クラスがロードされると、この定数は初期化されてこの領域に配置され、グローバルに共有され、すべてのアクセスが直接彼を指すことができます.
4:code segment、コード領域.コードを格納する領域であり、すべての実行コード(実は関数)がこの領域内に配置されます.オブジェクトの呼び出しによってこの領域を指します.
2つのスレッドが1つの単一のオブジェクトに同時にアクセスしようとしていると仮定します.
仕様の仮想マシンスレッドはmethod 1()を呼び出すときにこのようにします.
1)method 1()の局所変数をパラメータを含め、現在のスレッドのスタックに押し込む.2)現在のスレッドスタックから変数jをポップアップし、数値3を与える.3)現在のスレッドスタックからパラメータiをポップアップし、jと加算を実行する.4)現在のスレッドスタックから現在のメソッドが占有するスタックフレームを解放し、method 1()の結果を現在のスレッドスタックに押し込む.なお、現在のスレッドスタックは現在のスレッド固有であり、他のスレッドには絶対にアクセスされません.
1:heap、スタックメモリ、新しく作成したクラスオブジェクトを格納するために使用されます.実は、オブジェクトのメンバー変数値、変数タイプ、オブジェクトタイプタグを格納します.
2:stack、スタックメモリ、ローカル変数、オブジェクトへの参照などを格納します.
3:data segment、データ領域、この領域には主に静的定数と文字列定数が格納されます.クラスがロードされると、この定数は初期化されてこの領域に配置され、グローバルに共有され、すべてのアクセスが直接彼を指すことができます.
4:code segment、コード領域.コードを格納する領域であり、すべての実行コード(実は関数)がこの領域内に配置されます.オブジェクトの呼び出しによってこの領域を指します.
2つのスレッドが1つの単一のオブジェクトに同時にアクセスしようとしていると仮定します.
int method1(int i) {
int j = 3;
return i+j;
}
仕様の仮想マシンスレッドはmethod 1()を呼び出すときにこのようにします.
1)method 1()の局所変数をパラメータを含め、現在のスレッドのスタックに押し込む.2)現在のスレッドスタックから変数jをポップアップし、数値3を与える.3)現在のスレッドスタックからパラメータiをポップアップし、jと加算を実行する.4)現在のスレッドスタックから現在のメソッドが占有するスタックフレームを解放し、method 1()の結果を現在のスレッドスタックに押し込む.なお、現在のスレッドスタックは現在のスレッド固有であり、他のスレッドには絶対にアクセスされません.