// 自己写的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; }
原文:https://www.cnblogs.com/liuxiangru/p/11699584.html