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

  • 相关阅读:
    vuejs cli3 env配置文件实践指南
    Nginx的rewrite(地址重定向)剖析
    什么是TCP粘包?怎么解决这个问题
    windows bat批处理语法简析
    BAT文件语法和技巧(bat文件的编写及使用)
    Asyncio之EventLoop笔记
    python struct的使用例子
    redis慢查询笔记
    redis基础操作概念等笔记
    Python实现Dijkstra算法
  • 原文地址:https://www.cnblogs.com/aquariusm/p/7212658.html
Copyright © 2011-2022 走看看