CAS 分析
CAS是什么
(1) CAS(Compare and Swap) 比较并交换, 比较并交换是在多线程并发时用到的一种技术
(2) CAS是原子操作, 保证并发安全性, 而不是保证并发同步.
(3) CAS是一个CPU指令
(4) CAS是一种非阻塞的轻量级乐观锁
什么是乐观锁和悲观锁
乐观锁, 严格来讲并不是锁, 他是通过原子性来保证数据的同步, 乐观的认为在数据操作期间没有其他线程影响. 而悲观锁例如: synchronize 认为在数据操作期间一定会有其他线程影响, 所以会通过并发同步的方式来保证数据的正确. 所以CAS不会保证线程同步, 乐观地认为在数据更新期间没有其他线程影响.
CAS原理
CAS, 比较并交换, 是将内存值更新为需要的值, 但是有个条件, 就是内存值必须与期望值相同. 例如: 期望值 E, 工作内存值 M , 更新值 U, 只有 当 E == M 时, 将M 更新为U.
CAS应用
由于CAS是CPU指令,我们只能通过JNI与操作系统交互,关于CAS的方法都在sun.misc包下Unsafe的类里 java.util.concurrent.atomic包下的原子类等通过CAS来实现原子操作。
CAS指令
原子类例如AtomicInteger, 其中的getAndIncrement方法就用了CAS.
public final int getAndIncrement() {
//主要看这个getAndAddInt方法
return unsafe.getAndAddInt(this, valueOffset, 1);
}
//var1 是this指针
//var2 是地址偏移量
//var4 是自增的数值,是自增1还是自增N
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
//获取主内存值,这是内存值已经是旧的,假设我们称作期望值E
var5 = this.getIntVolatile(var1, var2);
//var5是期望值E,var5 + var4是要更新的值
//这个操作就是调用CAS的JNI,每个线程将自己内存里的内存值M和期望值E作比较,
//如果相同将内存值M更新为var5 + var4,并同步到主内存, 否则做自旋操
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
return var5;
}
流程:
1. 假设有两个线程: A, B
2. jvm 中主内存为1 , A, B 线程的工作内存为1 (工作内存会拷贝一份主内存的值)
3. 当前期望值E为1 , A, B 两个线程做+1操作
4. 执行到getAndAddInt方法, var5 = 1 , var4 = 1,
(1) A线程将var5 与工作内存值M比较, 比较var5 是否等于1
(2) 如果相等, 则将工作内存值更新为 var5+var4 , 并更新到主内存, 此时this指针的value = 2
(3) 如果不相等, 说明B线程先A线程进行了更新操作, 这时主内存值 = 2, A线程未更新成功继续循环, var5 更新为新主内存值 = 2, 因为this指针的value用volatile 修饰, 所以更新为2, 这时继续将 var5 与工作内存值M比较, 比较var5 是否等于 2 , 相等则将工作内存值更新为var5 + var4, 并更新到主内存, 此时this指针的value = 3; 主内存值为3;
(4) 如果一直不相等, 重复第三步直到相等退出更新.
CAS 优缺点
- 优点
非阻塞的轻量级乐观锁, 通过CPU指令实现, 在资源竞争不激烈的情况下性能高, 相比synchronize重量级悲观锁, synchronize有复杂的加锁, 解锁和唤醒线程操作.
- 缺点
(1) ABA 问题, 线程1, 2. 线程1 将A修改为B后又修改为A, 此时线程2以为A没有改变过. 而 J巴德原子类AtomicStampedReference, 通过控制变量值的版本来保证CAS的正确性.
(2) 自旋时间过长, 消耗CPU资源, 如果资源竞争激烈, 啧多线程自旋时间长消耗资源.
CAS 分析的更多相关文章
- 基于CAS分析对ABA问题的一点思考
基于CAS分析对ABA问题的一点思考 什么是CAS? 背景 synchronized加锁消耗太大 volatile只保证可见性,不保证原子性 基础 用CPU提供的特殊指令,可以: 自动更新共享数据; ...
- CAS分析——Core
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- CAS分析
CAS:Compare and Swap, 翻译成比较并交换. CAS 指的是现代 CPU 广泛支持的一种对内存中的共享数据进行操作的一种特殊指令.这个指令会对内存中的共享数据做原子的读写操作.简 ...
- Unsafe与CAS
Unsafe 简单讲一下这个类.Java无法直接访问底层操作系统,而是通过本地(native)方法来访问.不过尽管如此,JVM还是开了一个后门,JDK中有一个类Unsafe,它提供了硬件级别的原子操作 ...
- 什么是CAS机制?(转)
围绕下面四个点展开叙述: 一:什么是CAS机制? 二:Java当中CAS的底层实现 三:CAS的ABA问题和解决方法 四:java8对CAS的优化 一:什么是CAS机制? 我们先看一段代码: 启动两个 ...
- 深入分析CAS
CAS,Compare And Swap,即比较并交换.Doug lea大神在同步组件中大量使用CAS技术鬼斧神工地实现了Java多线程的并发操作.整个AQS同步组件.Atomic原子类操作等等都是以 ...
- 面试:为了进阿里,又把并发CAS(Compare and Swap)实现重新精读一遍
该系列文章已收录在公众号[Ccww技术博客],原创技术文章第一时间推出 前言 在面试中,并发线程安全提问必然是不会缺少的,那基础的CAS原理也必须了解,这样在面试中才能加分,那来看看面试可能会问那些问 ...
- 搜集好的java技术帖子,持续更新,java程序员的要求
1.Java NIO 系列教程 2.Java实现 二叉搜索树算法(BST) 3. Java 并发工具包 java.util.concurrent 用户指南 4.架构师之路系列:http://blog. ...
- JAVA CAS原理深度分析-转载
参考文档: http://www.blogjava.net/xylz/archive/2010/07/04/325206.html http://blog.hesey.net/2011/09/reso ...
随机推荐
- how to render html tag
使用autoescaping If autoescaping is turned on in the environment, all output will automatically be esc ...
- 2019-2020春江云暖你先知,CAE/EDA/高校等CloudHPC领域年均复合增长率超21%
原创: 灵魂工作室 速石科技 我猜,我们是最早和你说春天来了的人. 一年前,我们还在小心谨慎地定义着Cloud HPC,一脸娇羞地拿Novartis 诺华制药在5年前做的案例当作标杆. 不久前,Hyp ...
- python判断是否是质数
质数:只能被1和它自身整除 # 获取用户输入的数,判断是否是质数 num = int(input('输入一个任意的大于1的整数:')) i=2 # 创建一个变量,记录是否是质数,默认num是质数 fl ...
- Beetlex实现完整的HTTP协议
在传统网络服务中扩展中需要处理Bytes来进行协议的读写,这种原始的处理方式让工作变得相当繁琐复杂,出错和调试的工作量都非常大:组件为了解决这一问题引用Stream读写方式,这种方式可以极大的简化网络 ...
- 怎样使用七牛云CDN加速并绑定阿里云域名
昨天晚上在某个群里看到群友问,七牛云能不能绑定自己的域名作为静态资源文件的前缀,忽然想起来我已经有快两年时间没有登录过我的七牛云账号了,不禁老脸一红,这是有多久没有自己前后端都弄了,幸好还没有老年痴呆 ...
- 【C_Language】---最全面的C指针总结,初级程序员必备
好久没写博客了,重新学习C语言了的基础课程,发现很多东西都忘记的差不多了,闲来无事,总结一下关于指针的知识,希望能帮到像我一样的菜鸟们: 指针,众所周知是C语言的精华所在,不懂指针的话,你就不要说你学 ...
- 【JavaScript 基础知识】一篇关于 JavaScript 一些知识点的总结
JavaScript 中基础数据类型 数据类型名称 数据类型说明 Undefined 只有一个值,即 undefined ,声明变量的初始值. Null 只有一个值,即 null ,表示空指针, ...
- Java多线程的创建(二)
前言: 虽然java的API中说创建多线程的方式只有两种(There are two ways to create a new thread of execution),分别是继承Thread类创建和 ...
- 「 扫盲 」Web服务器和应用服务器的区别
我们经常使用apache,tomcat,nginx,jetty等服务器,但并不清楚它们间的区别,它们中,哪些是Web服务器,哪些是应用服务器?今天就来告诉你 Web服务器 理解WEB服务器,首先你要理 ...
- AutoIT测试实例
AutoIT是一款非常强大的免费功能自动化测试工具,使用它可以轻松实现web和winform的自动化测试.其脚本语言AU3语法类似于VB语言和vbs脚本语言,对于经常使用QTP的童鞋来说,非常容易上 ...