Unsafe 本地实现在JVM 源码的如下目录中:
hotspot-37240c1019fd\src\share\vm\prims\unsafe.cpp
unsafe.cpp 又调用了Atomic::cmpxchg,这个函数根据不同操作系统和不同CPU会有不同的实现,以atomic_linux_x86.inline.hpp 为例,在如下目录hotspot-37240c1019fd\src\os_cpu\linux_x86\vm
atomic_linux_x86.inline.hpp 封装了汇编语言,此汇编程序直接操作了CPU 指令,使用的CPU指令是cmpxchg
汇编代码如下:
inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) {
int mp = os::is_MP();
__asm__ volatile (LOCK_IF_MP(%4) "cmpxchgl %1,(%3)"
: "=a" (exchange_value)
: "r" (exchange_value), "a" (compare_value), "r" (dest), "r" (mp)
: "cc", "memory");
return exchange_value;
}
第一行 “=a” (exchange_value) 表示指令的输出
第二行: “r” (exchange_value), “a” (compare_value), “r” (dest), “r” (mp) 是输入参数