これらは, 同期排他処理 (monitorenter/monitorexit 命令, synchronized 修飾子) のためのクラス (See: here for details).
BasicObjectLock クラス用の補助クラス.
ロック対象のオブジェクトから退避した mark フィールド(markOopDesc)を格納しておくためのクラス (ロック処理では mark フィールドを書き換えてしまうため, 元の値を記録しておく必要がある).
((cite: hotspot/src/share/vm/runtime/basicLock.hpp))
class BasicLock VALUE_OBJ_CLASS_SPEC {
以下の箇所に格納されている (他にもある?? #TODO).
(BasicObjectLock クラスの _lock フィールドは, ポインタ型ではなく実体なので, BasicObjectLock オブジェクトの生成時に一緒に生成される)
(ObjectLocker クラスの _lock フィールドは, ポインタ型ではなく実体なので, ObjectLocker オブジェクトの生成時に一緒に生成される)
内部には以下のフィールドが1つあるだけ.
((cite: hotspot/src/share/vm/runtime/basicLock.hpp))
volatile markOop _displaced_header;
See: here for details
同期排他処理 (monitorenter 命令, monitorexit 命令) のためのクラス (See: here for details).
あるスレッドがあるメソッド内で取得したロックを記録しておくためのクラス. メソッド内でのロック解放漏れがないかどうか(IllegalMonitorStateException)のチェック処理で使用される. また, ロック処理が書き換えた mark フィールド(markOopDesc)の待避場所としても使用される (ただし, この中に mark フィールドが待避されているのは stack-locked 状態の場合のみ).
なお, BasicObjectLock オブジェクトは対応するスタックフレーム内に埋め込まれている (コメントでは "interpreter frame" と書かれているが, JIT コンパイルされたメソッドの場合もスタックフレーム内に埋め込まれている).
((cite: hotspot/src/share/vm/runtime/basicLock.hpp))
// A BasicObjectLock associates a specific Java object with a BasicLock.
// It is currently embedded in an interpreter frame.
// Because some machines have alignment restrictions on the control stack,
// the actual space allocated by the interpreter may include padding words
// after the end of the BasicObjectLock. Also, in order to guarantee
// alignment of the embedded BasicLock objects on such machines, we
// put the embedded BasicLock at the beginning of the struct.
class BasicObjectLock VALUE_OBJ_CLASS_SPEC {
スタックフレーム内に(のみ)格納されている (See: here for details) (See: ...).
インタープリタの場合は, 未使用の BasicObjectLock がなくなるとスタックフレームを拡張して確保される (See: TemplateTable::monitorenter(), ).
JIT コンパイルされたメソッドの場合は, スタックフレームの確保時に同時に生成される.
内部には, ロック対象のオブジェクト(oop), 及びそのオブジェクトの mark フィールドを待避した BasicLock オブジェクトを保持している
((cite: hotspot/src/share/vm/runtime/basicLock.hpp))
BasicLock _lock; // the lock, must be double word aligned
oop _obj; // object holds the lock;
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.