阅读 135

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

服务器评测 http://www.cncsto.com/ 

服务器测评 http://www.cncsto.com/ 


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐