1. 程式人生 > >JavaCAS深入理解(牛篇)

JavaCAS深入理解(牛篇)

基本 wrap ctf fse 理論 error 一個 except jni

鼠篇寫的基本都是理論基礎,最近在研究Unsafe的源碼,大致看了看,還沒有太深入這篇牛篇,只能算是做個資源記錄吧。

從AtomicInteger類源碼看起來。

AtomicInteger源碼部分:

// setup to use Unsafe.compareAndSwapInt for updates
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    private static final long valueOffset;

    static {
        try {
            valueOffset 
= unsafe.objectFieldOffset (AtomicInteger.class.getDeclaredField("value")); } catch (Exception ex) { throw new Error(ex); } } private volatile int value;

這裏比較神奇的是:unsafe.objectFieldOffset 這個方法,方法的參數是Field類型。這裏就是聲明的volatile類型的value屬性。

跟蹤到Hotspot源碼裏可以看到:

Unsafe.cpp

UNSAFE_ENTRY(jlong, Unsafe_ObjectFieldOffset(JNIEnv *env, jobject unsafe, jobject field))
  UnsafeWrapper("Unsafe_ObjectFieldOffset");
  return find_field_offset(field, 0, THREAD);
UNSAFE_END
jint find_field_offset(jobject field, int must_be_static, TRAPS) {
  if (field == NULL) {
    THROW_0(vmSymbols::java_lang_NullPointerException());
  }

  oop reflected   
= JNIHandles::resolve_non_null(field); oop mirror = java_lang_reflect_Field::clazz(reflected); klassOop k = java_lang_Class::as_klassOop(mirror); int slot = java_lang_reflect_Field::slot(reflected); int modifiers = java_lang_reflect_Field::modifiers(reflected); if (must_be_static >= 0) { int really_is_static = ((modifiers & JVM_ACC_STATIC) != 0); if (must_be_static != really_is_static) { THROW_0(vmSymbols::java_lang_IllegalArgumentException()); } } int offset = instanceKlass::cast(k)->offset_from_fields(slot); return field_offset_from_byte_offset(offset); }

想看懂這段代碼,必須看懂java在jvm裏的對象體系了。

這篇文章很不錯,對此做了一個大概況介紹 http://www.sczyh30.com/posts/Java/jvm-klass-oop/

JavaCAS深入理解(牛篇)