CAS原理之笨鸟先飞
cas原理详解
一.直入正题(通过一道面试题刨析)
现在有这么一个需求,需要实现一个支持并发的计数功能,例如下面的代码
public class Increment{
private int count=0;
//多线程环境下对count执行++操作
}
面试官可能会提供上述代码问你,你觉得这个操作有什么问题,如果你说没有问题,那么恭喜你,大兄嘚,你可以走了,面试到此结束!
如果你说这段代码有问题,因为在并发环境下对count进行自增运算是不安全,好了,兄嘚,你入坑了。接着面试官会问问什么不安全以及如何解决这个问题呢?
二.为什么并发环境下的count自增操作不安全
因为count++不是原子操作,而是三个原子操作的组合:
读取内存中的count值赋值给局部变量temp
执行temp+1操作
将temp赋值给count
所以如果两个线程同时执行count++操作的话,我们不能保证线程1按顺序执行完上述三步后线程2才开始执行。
面试官露出了满(yin)意(xian)的笑容,兄嘚你知道的太多了,好吧,咱们继续,既然你说这么操作是不安全的,那么怎么解决呢?
三.并发环境下count++不安全问题的解决方案
synchronized加锁
public class Increment{
private int count=0;
public synchronized void add(){
count++
}
}
加锁后代码变成上面这样了,好了现在就是线程安全的了,同一时间只有一个线程能加锁,其他线程需要等待锁,这样就不会出现count计数不准确的问题了。
面试官还是不想放过你,接着问,这个方案还有没有可能优化一下呢?
引入synchronized会造成多个线程排队的问题,所以同一时间只有一个线程执行,这样的锁有点儿“重量级”了
虽然随着Java版本更新,也对synchronized做了很多优化,但是处理这种简单的累加操作,仍然显得“太重了”。人家synchronized是可以解决更加复杂的并发编程场景和问题的。
而且,在这个场景下,你要是用synchronized,不就相当于让各个线程串行化了么?一个接一个的排队,加锁,处理数据,释放锁,下一个再进来。
2.高效的方案Atomic原子类
你思索片刻说:对于这种的count++类的操作,我们完全可以换一种做法,java并发包下面提供了一系列的Atomic原子类,比如说AtomicInteger
public class Increment{
private AtomicInteger count=new AtomicInteger();
public synchronized void add(){
count.incrementAndGet();
}
}
多个线程可以并发的执行AtomicInteger的incrementAndGet()方法,意思就是给我把count的值累加1,接着返回累加后最新的值,实际上,Atomic原子类底层用的不是传统意义的锁机制,而是无锁化的CAS机制,通过CAS机制保证多线程修改一个数值的安全性。
你心想:看到没我都知道,这种事情难不倒我
这时面试官喝了口水说:小伙子懂得真多
你想这次面试应该问完了吧,可是没想到面试官接着又抛出一个问题:CAS底层实现原理是什么?
靠,没完了是吧,还问底层原理,也怪自己多嘴,非得说什么CAS,没办法,自己挖的坑说什么也得填上啊
流程图如下:
假如说有3个线程并发的要修改一个AtomicInteger的值,他们底层的机制如下:
首先,每个线程都会先获取当前的值,接着走一个原子的CAS操作,原子的意思就是这个CAS操作一定是自己完整执行完的,不会被别人打断。
然后CAS操作里,会比较一下,现在你的值是不是刚才我获取到的那个值啊?
如果是的话,OK!说明没人改过这个值,那你给我设置成累加1之后的一个值!
同理,如果有人在执行CAS的时候,发现自己之前获取的值跟当前的值不一样,会导致CAS失败,失败之后,进入一个无限循环,再次获取值,接着执行CAS操作!
说完连自己都佩服自己
心想可以了吧,结果面试官又抛出一个问题:CAS有没有什么问题
3.CAS性能优化
真是要了亲命了,还有完没完啊,我想静静了!!!!
这个CAS有什么问题呢?从上面的流程图其实可以看出来,比如说大量的线程同时并发修改一个AtomicInteger,可能有很多线程会不停的自旋,进入一个无限重复的循环中。
这些线程不停地获取值,然后发起CAS操作,但是发现这个值被别人改过了,于是再次进入下一个循环,获取值,发起CAS操作又失败了,再次进入下一个循环。
在大量线程高并发更新AtomicInteger的时候,这种问题可能会比较明显,导致大量线程空循环,自旋转,性能和效率都不是特别好,这个问题说到这里,恭喜你,你已经击败了80%的对手了大兄嘚!!!那么如何优化呢?
Java 8有一个新的类,LongAdder,他就是尝试使用分段CAS以及自动分段迁移的方式来大幅度提升多线程高并发执行CAS操作的性能,这个类具体是如何优化性能的呢?咱们看图说话:
LongAdder核心思想就是热点分离,这一点和ConcurrentHashMap的设计思想。就是将value值分离成一个数组,当多线程访问时,通过hash算法映射到其中的一个数字进行计数。而最终的结果,就是这些数组的求和累加。这样一来,就减小了锁的粒度
LongAddr的兄弟类如下:
说到这里面试官终于说话:行,这个问题就问道这里了!!!
CAS原理之笨鸟先飞相关推荐
- cas无法使用_【漫画】CAS原理分析!无锁原子类也能解决并发问题!
本文来源于微信公众号[胖滚猪学编程].转载请注明出处 在漫画并发编程系统博文中,我们讲了N篇关于锁的知识,确实,锁是解决并发问题的万能钥匙,可是并发问题只有锁能解决吗?今天要出场一个大BOSS:CAS ...
- TS各个表 与 SECTION 的解析 CAS原理
TS流,通过一个个的TS包来传送: TS包可以是传送PSI SI等各表的数据包,也可以是传送节目音视频数据(携带的PES包:音视频基本流包)的包:TS携带 PSI SI等表的数据时,各个表以各表对应的 ...
- 面试被问到CAS原理,触及知识盲区,脸都绿了!
文章目录 前提知识掌握 什么是CAS? CAS原理 CAS带来的问题 CAS原理总结,面试问到了到底该怎么说? 尾言 前提知识掌握 想要了解 CAS 底层原理,那么我们先来了解一下 java.uit. ...
- 真实业务场景展现CAS原理的ABA问题及解决方案
文章目录 阅读提示 CAS原理.ABA问题介绍 真实业务场景 如何解决ABA问题 CAS学习总结 阅读提示 本文将借助开保险柜的业务场景重点阐述误用AtomicBoolean引起的ABA问题,以及解决 ...
- Java并发基石CAS原理以及ABA问题
在学习CAS之前,先从一个简单的案例入手,进而引出CAS的基本使用: 1.基于CAS的网站计数器 需求: 我们开发一个网站,需要对访问量进行统计,用户每发送一次请求,访问量+1,如何实现? 我们模拟有 ...
- CAS原理——乐观锁机制
CAS原理--乐观锁机制 一:CAS原理 二:ABA问题 一:CAS原理 乐观锁的本质即是CAS,操作系统提供了支持CAS修改内存值的原子指令,所以乐观锁得以实现. CAS(CompareAndSwa ...
- 单点登录之CAS原理和实现(转载)
转载源:https://www.jianshu.com/p/613c615b7ef1 单点登录之CAS原理和实现 来源于作者刘欣的<码农翻身> + 自己的备注理解 这家集团公司财大气粗,竟 ...
- JAVA CAS原理深度分析
CAS CAS:Compare and Swap, 翻译成比较并交换. java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁. 本文先从CAS的 ...
- CAS原理 基础篇(漫画版)
注:本文转自 程序员小灰 微信公众号~ CAS基础篇 示例程序: 启动两个线程,每个线程中让静态变量count循环累加100次. 最终输出的count结果是什么呢?一定会是200吗? 加了同步锁之后, ...
最新文章
- VBS脚本常用经典代码收集
- .NET 云原生架构师训练营(模块二 基础巩固 日志)--学习笔记
- 【结论】游戏(jzoj 1984)
- 华为研发雄起加拿大!
- SCUT - 290 - PARCO的因数游戏 - 博弈论
- 数理统计期末复习知识点总结(一)
- 用PLSQL解决世界最难数独(不到1毫秒)
- idea导入项目后没有被识别为maven项目的解决办法
- cc1101 使用笔记
- 专转本c语言刷题app,南京晓庄学院五年一贯制专转本c语言模拟考试2
- [Learn Android Studio 汉化教程]Reminders实验(一)
- 利用PHP语言开发手机app后台服务器的框架是什么?或者说开发流程是怎么样的?
- Python4班平均成绩统计_郑州十一中2020届高考成绩简析(含新疆内高班)
- linux游戏模拟器知乎,疯狂周三:異議あり!+TGS参展阵容:卡普空生化危机8,光荣真三新作_STEAM每日资讯_瞅啥网...
- 电磁场与电磁波:法拉第电磁感应定律,高斯定律的高斯定律
- 入营要求985/211,中国科学技术大学计算机学院2022年夏令营来袭
- 浮动( Floats )
- vue项目运行报错Refused to load the image 'http://localhost:8080/favicon.ico' because it violates the follo
- 静电放电防护设计规范和指南
- proxifier for mac 注册码
热门文章
- html缩放背景不缩放_如何将缩放背景更改为有趣的照片或视频
- Linux - Vim(Vi-Improved)
- 黄光裕减持国美零售:套现5亿港元 与张近东成难兄难弟
- 详细解释什么是JavaEE?
- Windows Live ID Delegated Authentication
- be delegated to target bean. Switch its visibility to package or protected.
- python汉明距离检索_汉明距离(Python3)
- mysql空间函数汇总
- WINCE IE浏览器定制(二)
- adapter调用fragment中的方法