hotspot/src/share/vm/runtime/synchronizer.cpp
// NOTE: must use heavy weight monitor to handle jni monitor exit
void ObjectSynchronizer::jni_exit(oop obj, Thread* THREAD) {
{- -------------------------------------------
(1) (トレース出力)
---------------------------------------- -}
TEVENT (jni_exit) ;
{- -------------------------------------------
(1) UseBiasedLocking オプションが指定されている場合には,
BiasedLocking::revoke_and_rebias() を呼んで revoke しておく.
---------------------------------------- -}
if (UseBiasedLocking) {
BiasedLocking::revoke_and_rebias(obj, false, THREAD);
}
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(!obj->mark()->has_bias_pattern(), "biases should be revoked by now");
{- -------------------------------------------
(1) ObjectSynchronizer::inflate() で ObjectMonitor オブジェクトを取得.
---------------------------------------- -}
ObjectMonitor* monitor = ObjectSynchronizer::inflate(THREAD, obj);
{- -------------------------------------------
(1) ObjectMonitor::check() で, カレントスレッドがロックを確保していることを確認しておく.
ロックを確保していれば, ObjectMonitor::exit() でロックの開放処理を行う.
(ロックを確保していなかった場合には, ObjectMonitor::check() が IllegalMonitorStateException を出す)
(なおコメントによると, ObjectMonitor::check() の呼び出し時に CHECK マクロを使ってはいけないとのこと.
ObjectMonitor::check() が true を返す場合には, 例外が起きていても exit 処理は行わなければいけない.)
---------------------------------------- -}
// If this thread has locked the object, exit the monitor. Note: can't use
// monitor->check(CHECK); must exit even if an exception is pending.
if (monitor->check(THREAD)) {
monitor->exit(THREAD);
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.