hotspot/src/share/vm/runtime/biasedLocking.cpp
void BiasedLocking::revoke_at_safepoint(GrowableArray<Handle>* objs) {
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(SafepointSynchronize::is_at_safepoint(), "must only be called while at safepoint");
{- -------------------------------------------
(1) (以下の for ループで objs 引数の要素の個数分だけループし, それぞれの要素を処理する)
---------------------------------------- -}
int len = objs->length();
for (int i = 0; i < len; i++) {
{- -------------------------------------------
(1.1) (変数宣言など)
---------------------------------------- -}
oop obj = (objs->at(i))();
{- -------------------------------------------
(1.1) まず update_heuristics() を呼んで, heuristics 情報を更新し, どうすべきかを決める.
---------------------------------------- -}
HeuristicsResult heuristics = update_heuristics(obj, false);
{- -------------------------------------------
(1.1) heuristics の結果が HR_SINGLE_REVOKE であれば, revoke_bias() で対象のオブジェクトを revoke させる.
---------------------------------------- -}
if (heuristics == HR_SINGLE_REVOKE) {
revoke_bias(obj, false, false, NULL);
{- -------------------------------------------
(1.1) heuristics の結果が HR_BULK_REBIAS か HR_BULK_REVOKE であれば,
bulk_revoke_or_rebias_at_safepoint() で bulk revoke または bulk rebias を起こす.
---------------------------------------- -}
} else if ((heuristics == HR_BULK_REBIAS) ||
(heuristics == HR_BULK_REVOKE)) {
bulk_revoke_or_rebias_at_safepoint(obj, (heuristics == HR_BULK_REBIAS), false, NULL);
}
}
{- -------------------------------------------
(1) キャッシュしていた情報はもう使えないので,
clean_up_cached_monitor_info() を呼び出して
各 JavaThread 内にキャッシュしておいた「使用中のロック情報」を全部消しておく.
(このキャッシュ情報は get_or_compute_monitor_info() 内で(のみ)参照されている.
See: JavaThread::cached_monitor_info())
---------------------------------------- -}
clean_up_cached_monitor_info();
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.