unsafe中对应拥有三个方法 compareAndSwapObject ,compareAndSwapIntcompareAndSwapLong ,他们都被标记为native

compareAndSwapObject

它的核心实现为

oop res = oopDesc::atomic_compare_exchange_oop(x, addr, e);

实现核心如下

inline oop oopDesc::atomic_compare_exchange_oop(oop exchange_value,volatile HeapWord *dest,oop compare_value) {if (UseCompressedOops) {narrowOop val = encode_heap_oop(exchange_value);narrowOop cmp = encode_heap_oop(compare_value);narrowOop old = (narrowOop) Atomic::cmpxchg(val, (narrowOop*)dest, cmp);return decode_heap_oop(old);} else {return (oop)Atomic::cmpxchg_ptr(exchange_value, (oop*)dest, compare_value);}
}

UseCompressedOops: 32位平台运行的程序在64位上会占用更大的长度,可以使用 -XX:+UserCompressedOops压缩指针,达到节约内存的目的。

compareAndSwapInt

核心代码如下

return (jint)(Atomic::cmpxchg(x, addr, e)) == e;

compareAndSwapLong

核心代码如下

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;
}

supports_cx8:判断硬件是不是支持8-byte compare-exchange , x86架构中通过cpuid指令来获取是否试支持,CMPXCHG8指令 ;SPARC架构也是看 (_features & v9_instructions_m)指令的支持情况

Atomic::cmpxchg

无论是那个调用,最终都归结到了Atomic上,Atomic.hpp中函数声明如下

//比较当前的值和目的地址的值,如果比较成功,就把目的地址的值更改为exchange_value,并返回原来存的值
static jbyte    cmpxchg    (jbyte    exchange_value, volatile jbyte*    dest, jbyte    compare_value);
static jint     cmpxchg    (jint     exchange_value, volatile jint*     dest, jint     compare_value);
static jlong    cmpxchg    (jlong    exchange_value, volatile jlong*    dest, jlong    compare_value);
static unsigned int cmpxchg(unsigned int exchange_value, volatile unsigned int* dest, unsigned int compare_value);
static intptr_t cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value);
static void*    cmpxchg_ptr(void*    exchange_value, volatile void*     dest, void*    compare_value);

从Atomic.cpp可以看到在不同的操作系统中有不同的实现
在 windows_x86中,一种实现如下

inline jint     Atomic::cmpxchg    (jint     exchange_value, volatile jint*     dest, jint     compare_value) {int mp = os::is_MP(); //查看是否是多核__asm {mov edx, destmov ecx, exchange_valuemov eax, compare_valueLOCK_IF_MP(mp)cmpxchg dword ptr [edx], ecx}
}

linux_x86中,实现如下

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;
}

可以看到最终都是使用操作系统对应的指令来完成

都在哪儿用了


可以看到Atomic的实现就是用的CAS,比如AtomicIntegerincrementAndGet

public final int incrementAndGet() {for (;;) {int current = get();int next = current + 1;if (compareAndSet(current, next))return next;}
}

这种一直循环的操作也称作自旋

CAS的缺点

  • 如果一直没有成功,则一直循环,给CPU带来很大的开销。
  • 只能是一个变量
  • ABA问题。一个变量取值为A,恰巧另一个线程将它换成了B然后又换回来了,这个时候再读取还是A,实际上是改变了值。java自身提供了AtomicStampedReference来解决这个问题,原理是添加一个额外的版本来做判断

源码来自jdk1.7

CAS(compareAndSwap)原理相关推荐

  1. 深入理解CAS算法原理

    转载自 深入理解CAS算法原理 1.什么是CAS? CAS:Compare and Swap,即比较再交换. jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法 ...

  2. 面试:CAS算法原理

    1.什么是CAS? CAS:Compare and Swap,即比较再交换. jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronou ...

  3. Java CAS底层原理

    Java CAS底层原理 Java CAS底层原理,这一篇就够了!!! CAS全称(Conmpare And Swap)比较并交换,是一种用于在多线程环境下实现同步功能的机制.CAS 操作包含三个操作 ...

  4. cas无法使用_一文彻底搞懂CAS实现原理

    本文导读: 前言 如何保障线程安全 CAS原理剖析 CPU如何保证原子操作 解密CAS底层指令 小结 前言 日常编码过程中,基本不会直接用到 CAS 操作,都是通过一些JDK 封装好的并发工具类来使用 ...

  5. CAS+SSO原理浅谈

    http://www.cnblogs.com/yonsin/archive/2009/08/29/1556423.html SSO 是一个非常大的主题,我对这个主题有着深深的感受,自从广州 UserG ...

  6. springboot + springsecurity + cas学习笔记(二)—— CAS认证原理

    CAS,Central Authentication Service-中央认证服务,是Yale 大学发起的一个企业级的.开源的项目,旨在为Web应用系统提供一种可靠的SSO解决方案.下面简单介绍SSO ...

  7. CAS SSO 原理 - 基础模式

    对于这个老话题,网上太多的资料,但是要让大家清楚地理解CAS还是不太容易,所以,读了一些文章,并做了一些摘录整理,方便新人理解. 对于CAS登录的过程,下面这段是讲得最清楚的. 登录应用A 主要原理: ...

  8. 一文搞懂CAS,CAS原理分析及ABA问题详解

    什么是CAS CAS即Compare And Swap的缩写,翻译成中文就是比较并交换,其作用是让CPU比较内存中某个值是否和预期的值相同,如果相同则将这个值更新为新值,不相同则不做更新,也就是CAS ...

  9. JAVA CAS原理深度分析

    CAS CAS:Compare and Swap, 翻译成比较并交换. java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁. 本文先从CAS的 ...

最新文章

  1. Linux组管理和权限管理
  2. linux boot空间分多少,/boot分区空间不足,清理老内核所占空间
  3. Numpy数据分析数值范围调整、计算
  4. 【白皮书分享】2021汽车产业数字化转型白皮书-腾讯研究院.pdf(附下载链接)...
  5. 宛如造句,小学生怎么用宛如造句?
  6. 决策树系列(四)——C4.5
  7. java-后端八股文
  8. AIR202的lua开发
  9. Windows设置电脑每天自动重启
  10. 男人成为富翁必备五大特质
  11. 多旋翼无人机技术详解
  12. 鼠标点击网页出现爱心特效
  13. layui table 获取单元格总是多一个
  14. 计算机公式乘法字处理,字符串乘法
  15. 1135 mysql_mysql中一个普通ERROR 1135 (HY000)错误引发的血案_MySQL
  16. 3D游戏从入门到精通-32
  17. phpstudy安装及使用教程
  18. Http抓包工具--查尔斯
  19. python学习基础篇Day02(P11~~23)
  20. 云计算中——VDC和VPC

热门文章

  1. Hessian RPC示例和基于Http请求的Hessian序列化对象传输
  2. 银光中国网免费Silverlight空间Web Service部署方法
  3. 一个关于CentOS下apache配置修改生效的问题
  4. gitlab windows安装_gitlab pages之gitlab-runner 安装(windows)
  5. 使用uni-app实现使用浏览器下载功能时,安卓端部分机型不兼容问题(小米/华为)
  6. 用python分析excel数据_Python3分析Excel数据
  7. Kali Linux修改桌面默认图标
  8. Xamarin.Forms使用Slider注意问题
  9. Ext分区文件恢复工具extundelete
  10. 用matlab解公式,怎么用matlab解这个公式A MATLAB script that solves the differential e