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
未完,待续~~~~