CAS算法

// 自己写的java代码
AtomicInteger atomicInteger = new AtomicInteger(2);
atomicInteger.incrementAndGet()
    // java源代码 Unsafe -> getAndAddInt

  public final int getAndAddInt(Object var1, long var2, int var4) { int var5; do { var5 = this.getIntVolatile(var1, var2); } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4)); return var5; }
如果有写的不对的地方,请您帮忙指正。

本地方法(非java虚拟机执行的):getIntVolatile 、 compareAndSwapInt 。
java变量解释用处:

var1 是原对象 // 指的应该是AtomicInteger
var2 是内存偏移量 // 在c代码中为offset
var4 是增加量 // 此处代码调用的是incrementAndGet()方法,是自增1,所以增加量是1
var5 为取到的内存中 atomicInteger 的值

  他必须在某些条件才会执行放入var5+var4(也就是newValue)的操作,条件为:

  offset位置的值(MemberOffset(offset))和期望值(expectedValue)相同时,才会把计算过后的值(newValue)放进去

c代码:

    static jboolean Unsafe_compareAndSwapLong(JNIEnv*env, jobject, jobject javaObj, jlong offset, jlong expectedValue, jlong newValue) {
        ScopedFastNativeObjectAccess soa (env);
        ObjPtr<mirror::Object > obj = soa.Decode < mirror::Object > (javaObj);
        // JNI must use non transactional mode.
        bool success = obj -> CasFieldStrongSequentiallyConsistent64 < false > (MemberOffset(offset), expectedValue,
        newValue);
        return success ? JNI_TRUE : JNI_FALSE;
    }

posted on 2019-10-18 17:31  刘相如  阅读(420)  评论(0)    收藏  举报