hotspot/src/share/vm/runtime/biasedLocking.cpp
virtual void doit() {
{- -------------------------------------------
(1) VM_RevokeBias には2種類のコンストラクタがあり, どちらが使われたかによって _obj フィールドが NULL かどうかが決まる.
ここでは, その _obj フィールドの値に応じて2通りの処理を行う.
* _obj フィールドが NULL でない場合:
revoke_bias() を呼び出してリターンする.
* _obj フィールドが NULL の場合:
BiasedLocking::revoke_at_safepoint(GrowableArray<Handle>* objs) を呼び出してリターンする.
(なお, _obj フィールドが NULL でない場合については, revoke_bias() の呼び出し後に
clean_up_cached_monitor_info() の呼び出しも行い,
各 JavaThread 内にキャッシュしておいた「使用中のロック情報」を全部消す処理も行っている.
このキャッシュ情報は get_or_compute_monitor_info() 内で(のみ)参照されている.
See: JavaThread::cached_monitor_info())
(なお, どちらの場合であっても, あわせて(トレース出力)も出している)
---------------------------------------- -}
if (_obj != NULL) {
{- -------------------------------------------
(1.1) (トレース出力)
---------------------------------------- -}
if (TraceBiasedLocking) {
tty->print_cr("Revoking bias with potentially per-thread safepoint:");
}
_status_code = revoke_bias((*_obj)(), false, false, _requesting_thread);
clean_up_cached_monitor_info();
return;
} else {
{- -------------------------------------------
(1.1) (トレース出力)
---------------------------------------- -}
if (TraceBiasedLocking) {
tty->print_cr("Revoking bias with global safepoint:");
}
BiasedLocking::revoke_at_safepoint(_objs);
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.