java中unsafe.compareAndSwapLong研究

jvm中关于普通long类型的处理源码地址:openjdk/hotspot/src/share/vm/prims/unsafe.cpp

UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong e, jlong x))
  UnsafeWrapper("Unsafe_CompareAndSwapLong");
  Handle p (THREAD, JNIHandles::resolve(obj));
  jlong* addr = (jlong*)(index_oop_from_field_offset_long(p(), offset));
  if (VM_Version::supports_cx8())
    return (jlong)(Atomic::cmpxchg(x, addr, e)) == e;
  else {
    jboolean success = false;
    ObjectLocker ol(p, THREAD);
    if (*addr == e) { *addr = x; success = true; }
    return success;
  }
UNSAFE_END

如果虚拟机版本不支持cx8就使用ObjectLocker,如果支持就使用Atomic:cmpxchg原子操作,

VM_Version::supports_cx8()函数在openjdk/hotspot/src/share/vm/runtime/vm_version.hpp中定义

代码如下:

  static bool supports_cx8()  {
#ifdef SUPPORTS_NATIVE_CX8
    return true;
#else
    return _supports_cx8;
#endif
  }

#ifdef是c++中的条件编译,如果SUPPORTS_NATIVE_CX8为true,则这个函数最终是:

static bool supports_cx8()  {
    return true;
}

否则,这个函数是:

static bool supports_cx8()  {
    return _supports_cx8;
}

_supports_cx8在openjdk/hotspot/src/share/vm/runtime/vm_version.cpp中定义:

bool Abstract_VM_Version::_supports_cx8 = false;

默认为false

未完,待续~~~~

转载于:https://my.oschina.net/yjydmlh/blog/785934

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值