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原理之笨鸟先飞相关推荐

  1. cas无法使用_【漫画】CAS原理分析!无锁原子类也能解决并发问题!

    本文来源于微信公众号[胖滚猪学编程].转载请注明出处 在漫画并发编程系统博文中,我们讲了N篇关于锁的知识,确实,锁是解决并发问题的万能钥匙,可是并发问题只有锁能解决吗?今天要出场一个大BOSS:CAS ...

  2. TS各个表 与 SECTION 的解析 CAS原理

    TS流,通过一个个的TS包来传送: TS包可以是传送PSI SI等各表的数据包,也可以是传送节目音视频数据(携带的PES包:音视频基本流包)的包:TS携带 PSI SI等表的数据时,各个表以各表对应的 ...

  3. 面试被问到CAS原理,触及知识盲区,脸都绿了!

    文章目录 前提知识掌握 什么是CAS? CAS原理 CAS带来的问题 CAS原理总结,面试问到了到底该怎么说? 尾言 前提知识掌握 想要了解 CAS 底层原理,那么我们先来了解一下 java.uit. ...

  4. 真实业务场景展现CAS原理的ABA问题及解决方案

    文章目录 阅读提示 CAS原理.ABA问题介绍 真实业务场景 如何解决ABA问题 CAS学习总结 阅读提示 本文将借助开保险柜的业务场景重点阐述误用AtomicBoolean引起的ABA问题,以及解决 ...

  5. Java并发基石CAS原理以及ABA问题

    在学习CAS之前,先从一个简单的案例入手,进而引出CAS的基本使用: 1.基于CAS的网站计数器 需求: 我们开发一个网站,需要对访问量进行统计,用户每发送一次请求,访问量+1,如何实现? 我们模拟有 ...

  6. CAS原理——乐观锁机制

    CAS原理--乐观锁机制 一:CAS原理 二:ABA问题 一:CAS原理 乐观锁的本质即是CAS,操作系统提供了支持CAS修改内存值的原子指令,所以乐观锁得以实现. CAS(CompareAndSwa ...

  7. 单点登录之CAS原理和实现(转载)

    转载源:https://www.jianshu.com/p/613c615b7ef1 单点登录之CAS原理和实现 来源于作者刘欣的<码农翻身> + 自己的备注理解 这家集团公司财大气粗,竟 ...

  8. JAVA CAS原理深度分析

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

  9. CAS原理 基础篇(漫画版)

    注:本文转自 程序员小灰 微信公众号~ CAS基础篇 示例程序: 启动两个线程,每个线程中让静态变量count循环累加100次. 最终输出的count结果是什么呢?一定会是200吗? 加了同步锁之后, ...

最新文章

  1. VBS脚本常用经典代码收集
  2. .NET 云原生架构师训练营(模块二 基础巩固 日志)--学习笔记
  3. 【结论】游戏(jzoj 1984)
  4. 华为研发雄起加拿大!
  5. SCUT - 290 - PARCO的因数游戏 - 博弈论
  6. 数理统计期末复习知识点总结(一)
  7. 用PLSQL解决世界最难数独(不到1毫秒)
  8. idea导入项目后没有被识别为maven项目的解决办法
  9. cc1101 使用笔记
  10. 专转本c语言刷题app,南京晓庄学院五年一贯制专转本c语言模拟考试2
  11. [Learn Android Studio 汉化教程]Reminders实验(一)
  12. 利用PHP语言开发手机app后台服务器的框架是什么?或者说开发流程是怎么样的?
  13. Python4班平均成绩统计_郑州十一中2020届高考成绩简析(含新疆内高班)
  14. linux游戏模拟器知乎,疯狂周三:異議あり!+TGS参展阵容:卡普空生化危机8,光荣真三新作_STEAM每日资讯_瞅啥网...
  15. 电磁场与电磁波:法拉第电磁感应定律,高斯定律的高斯定律
  16. 入营要求985/211,中国科学技术大学计算机学院2022年夏令营来袭
  17. 浮动( Floats )
  18. vue项目运行报错Refused to load the image 'http://localhost:8080/favicon.ico' because it violates the follo
  19. 静电放电防护设计规范和指南
  20. proxifier for mac 注册码

热门文章

  1. html缩放背景不缩放_如何将缩放背景更改为有趣的照片或视频
  2. Linux - Vim(Vi-Improved)
  3. 黄光裕减持国美零售:套现5亿港元 与张近东成难兄难弟
  4. 详细解释什么是JavaEE?
  5. Windows Live ID Delegated Authentication
  6. be delegated to target bean. Switch its visibility to package or protected.
  7. python汉明距离检索_汉明距离(Python3)
  8. mysql空间函数汇总
  9. WINCE IE浏览器定制(二)
  10. adapter调用fragment中的方法