zoukankan      html  css  js  c++  java
  • JavaCAS深入理解(牛篇)

    鼠篇写的基本都是理论基础,最近在研究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/

    还有一篇大牛级文章:http://rednaxelafx.iteye.com/blog/730461

  • 相关阅读:
    利用Python中SocketServer 实现客户端与服务器间非阻塞通信
    Redis单机配置多实例,实现主从同步
    Django(一) 安装使用基础
    数组模拟环形队列
    单链表原理及应用举例
    中缀表达式转换为后缀表达式(思路)
    中缀表达式转后缀表达式(代码实现)及前缀表达式思路补充
    数组模拟栈(Stack)
    双向链表原理及应用举例
    单向环形链表
  • 原文地址:https://www.cnblogs.com/aquariusm/p/7212658.html
Copyright © 2011-2022 走看看