首页 > 编程语言 > 详细

CAS算法

时间:2019-10-18 18:35:19      阅读:80      评论:0      收藏:0      [点我收藏+]
// 自己写的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;
    }

CAS算法

原文:https://www.cnblogs.com/liuxiangru/p/11699584.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!