hotspot/src/share/vm/oops/instanceKlass.cpp
/* jni_id_for_impl for jfieldIds only */
JNIid* instanceKlass::jni_id_for_impl(instanceKlassHandle this_oop, int offset) {
{- -------------------------------------------
(1) JfieldIdCreation_lock のロックを取った状態で
もう一度 JNIid::find() を呼び出し,
offset 引数で指定された値に対応する JNIid オブジェクトが
既にこの instanceKlass の jni_ids フィールドに存在しないかどうか探してみる.
もしそういう JNIid オブジェクトが見つかれば, それをリターンするだけ.
見つからなければ,
対応する JNIid オブジェクト作成し, jni_ids フィールドにあるリストの先頭に追加した後,
リターンする.
---------------------------------------- -}
MutexLocker ml(JfieldIdCreation_lock);
// Retry lookup after we got the lock
JNIid* probe = this_oop->jni_ids() == NULL ? NULL : this_oop->jni_ids()->find(offset);
if (probe == NULL) {
// Slow case, allocate new static field identifier
probe = new JNIid(this_oop->as_klassOop(), offset, this_oop->jni_ids());
this_oop->set_jni_ids(probe);
}
return probe;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.