Up Top

JNI の処理 : JNI Functions の処理 : JNI による同期排他処理(Monitor Operations)


該当する JNI 関数

概要(Summary)

JNI によるロック処理は, 基本的には monitorenter/monitorexit と類似した処理になる (See: here for details).

ただし, JNI によるロック処理では biased locking や stack-locked 等といった最適化は行われず, 常に ObjectMonitor が用いられる (このため, 当然ながらロック状態は inflated になる. biased 状態だった場合は revoke 処理なども行われる).

また, JNI によるロック/アンロックでは BasicObjectLock がまったく使用されない (このため JNI でロックしたものは monitorexit では解放できない. まぁそもそも現在の HotSpot では他メソッドで取得したロックは monitorexit では解放できないけど...)

なお, JNI で確保したロックについては DetachCurrentThread() 時にも解放処理が行われる (これは JNI 仕様に沿った挙動. そのスレッドが保持している全てのモニターが解放される).

処理の流れ (概要)(Execution Flows : Summary)

MonitorEnter() の処理

jni_MonitorEnter()
-> ObjectSynchronizer::jni_enter()
   -> BiasedLocking::revoke_and_rebias()
      -> (See: here for details)
   -> ObjectSynchronizer::inflate()
      -> (See: here for details)
   -> ObjectMonitor::enter()
      -> (See: here for details)

MonitorExit() の処理

jni_MonitorExit()
-> ObjectSynchronizer::jni_exit()
   -> BiasedLocking::revoke_and_rebias()
      -> (See: here for details)
   -> ObjectSynchronizer::inflate()
      -> (See: here for details)
   -> ObjectMonitor::check()
   -> ObjectMonitor::exit()
      -> (See: here for details)

DetachCurrentThread() の処理

(See: here for details)

処理の流れ (詳細)(Execution Flows : Details)

jni_MonitorEnter()

See: here for details

ObjectSynchronizer::jni_enter()

See: here for details

jni_MonitorExit()

See: here for details

ObjectSynchronizer::jni_exit()

See: here for details

ObjectMonitor::check()

See: here for details

ObjectMonitor::check_slow()

See: here for details


This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.