jvm源码解读--16 cas 用法解析
jvm源码解读--16 cas 用法解析
UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x)) UnsafeWrapper("Unsafe_CompareAndSwapInt"); oop p = JNIHandles::resolve(obj); jint* addr = (jint *) index_oop_from_field_offset_long(p, offset); return (jint)(Atomic::cmpxchg(x, addr, e)) == e; UNSAFE_END
return (jint)(Atomic::cmpxchg(x, addr, e)) == e;
分析,有三个值,内存值V,旧的预期值A,新的修改值B;
如果A==V,那么把B赋值给V,返回V,如果A!=V,直接返回V;
进入
jbyte Atomic::cmpxchg(jbyte exchange_value, volatile jbyte* dest, jbyte compare_value) { assert(sizeof(jbyte) == 1, "assumption."); uintptr_t dest_addr = (uintptr_t)dest; uintptr_t offset = dest_addr % sizeof(jint); volatile jint* dest_int = (volatile jint*)(dest_addr - offset); jint cur = *dest_int; jbyte* cur_as_bytes = (jbyte*)(&cur); jint new_val = cur; jbyte* new_val_as_bytes = (jbyte*)(&new_val); new_val_as_bytes[offset] = exchange_value; while (cur_as_bytes[offset] == compare_value) { jint res = cmpxchg(new_val, dest_int, cur);//
(res == cur) ===
inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value) {
//
return _Atomic_cmpxchg_long(exchange_value, dest, compare_value, os::is_MP());
}
//
inline jlong _Atomic_cmpxchg_long(jlong exchange_value, jlong* dest, jlong compare_value, %) (exchange_value), (compare_value), (dest), , 0 == mp = ( (cvl.words[]), (cvl.words[(cvl.words[]), (cvl.words[(evl.words[]), (evl.words[(dest), ,
来源:https://www.cnblogs.com/zytcomeon/p/14784900.html