---- 什么是CAS机制

CAS机制主要是发生于Java中原子操作类(JUC)的底层实现中,其中在CAS机制中包含3个基本参数:内存地址V、旧预期值A、要修改的新值B。

当要更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同的时候,才会将内存地址V对应的值修改为B

举个栗子

  1. 在一个内存地址为V内存中,储存着变量值10(即此时A=10)
  2. 此时,来了一个线程A,想对该变量进行增加1操作(即此时对线程A来说:A=10,B=11)
  3. 但是,当线程A操作之前,被线程B插入率先将该变量进行修改成11(即此时A=11)
  4. 接着,等线程A想来修改的时候,通过内存地址V获取当前最新的值与自身线程的预期值进行比对(此时线程A的A=10),发现不一样,导致更新失败
  5. 线程A重新获取内存地址V的当前值,并重新计算想要修改的新值,即自旋操作。(此时对线程A来说,A=11,B=12)
  6. 这一次没有其他线程的干扰,线程A通过获取内存地址V的实际值,成功比较后,并且将内存地址V的值修改成12

--- 优点

    由于Synchronized是个重量级别的锁,每次使用会引起用户态和核心态之间进行转换,在转换之间需要耗费很多的处理时间,所以,如果使用CAS机制,在并发不是很多的情况下,可以减少用户态和核心态进行切换,从而提高系统性能。

---缺点

  • cpu开销大,在高并发下,许多线程,更新一变量,多次更新不成功,循环反复,给cpu带来大量压力
  • 只是一个变量的原子性操作,不能保证代码块的原子性
  • ABA问题(不过一般极少出现)

举个栗子(ABA问题)

  1. 小埋去存银行卡有200块钱,去提款机取钱100,恰巧机器有点问题,在进行取款提交操作后台开启了两个线程A和B(200->100)
  2. 线程A成功执行,而且线程B阻塞了,此时小埋银行卡的余额为100
  3. 此时,小埋的哥哥给她卡了打了100块,此时小埋银行卡的余额为200
  4. 然后,线程B此时就又开始执行了,发现卡里的余额200和自身线程余额期待值一样,进行修改(200->100)
  5. 最后,小埋就只能去找柜台寻求帮助了,因为正常情况下,她现在的卡里应该还有200块

如何解决aba问题:
对内存中的值加个版本号,在比较的时候除了比较值还的比较版本号。

参考资料:

《深入了解Java虚拟机》

漫画:什么是 CAS 机制?

漫画:什么是CAS机制?(进阶篇)

CAS机制(多线程)的更多相关文章

  1. Java CAS同步机制 原理详解(为什么并发环境下的COUNT自增操作不安全): Atomic原子类底层用的不是传统意义的锁机制,而是无锁化的CAS机制,通过CAS机制保证多线程修改一个数值的安全性。

    精彩理解:  https://www.jianshu.com/p/21be831e851e ;  https://blog.csdn.net/heyutao007/article/details/19 ...

  2. 多线程 | 03 | CAS机制

    Compare and swap(CAS) 当前的处理器基本都支持CAS,只不过每个厂家所实现的算法并不一样罢了,每一个CAS操作过程都包含三个参数:一个内存地址V,一个期望的值A和一个新值B,操作的 ...

  3. 深入浅出Java并发包—CAS机制

    在JDK1.5之前.Java主要靠synchronized这个关键字保证同步,已解决多线程下的线程不安全问题,但是这会导致锁的发生,会引发一些个性能问题. 锁主要存在一下问题 (1)在多线程竞争下,加 ...

  4. CAS机制与自旋锁

    CAS(Compare-and-Swap),即比较并替换,java并发包中许多Atomic的类的底层原理都是CAS. 它的功能是判断内存中某个地址的值是否为预期值,如果是就改变成新值,整个过程具有原子 ...

  5. 什么是CAS机制?(转)

    围绕下面四个点展开叙述: 一:什么是CAS机制? 二:Java当中CAS的底层实现 三:CAS的ABA问题和解决方法 四:java8对CAS的优化 一:什么是CAS机制? 我们先看一段代码: 启动两个 ...

  6. 对CAS机制的理解(一)

    先看一段代码:启动两个线程,每个线程中让静态变量count循环累加100次. public class CountTest { public static int count = 0; public ...

  7. CAS机制总结

    一.简介 CAS机制:(Compare and set)比较和替换 简单来说–>使用一个期望值来和当前变量的值进行比较,如果当前的变量值与我们期望的值相等,就用一个新的值来更新当前变量的值CAS ...

  8. 高并发之CAS机制和ABA问题

    什么是CAS机制 CAS是英文单词Compare and Swap的缩写,翻译过来就是比较并替换 CAS机制中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B. 看如下几个例子: pac ...

  9. 并发编程的基石——CAS机制

    本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 Java中提供了很多原子操作类来保证共享变量操作的原子性 ...

随机推荐

  1. Unity3D将来时:IL2CPP(上)

    http://inpla.net/thread-8197-1-1.html Unity3D将来时:IL2CPP(上) (注:本文详细的讲述了C#,Mono,.Net, IL等Unity使用到的概念,如 ...

  2. locate的基本用法

    一.工作原理 1. locate是通过读取一个或多个由updatedb命令生成的数据库来查找文件的,而updatedb由计划任务程序cron每天运行来更新缺省的数据库(/var/lib/mlocate ...

  3. The 17th Zhejiang University Programming Contest Sponsored by TuSimple J

    Knuth-Morris-Pratt Algorithm Time Limit: 1 Second      Memory Limit: 65536 KB In computer science, t ...

  4. SqlParameter 操作 image 字段

    public static void AddEmployee( string lastName, string firstName, string title, DateTime hireDate, ...

  5. Python+selenium定位不到元素的问题及解决方案

    在操作过程中主要遇到两种阻塞的问题,总结如下: 1.页面中有iframe,定位元素时,需要用switch_to.frame()转换到元素所在的frame上再去定位 2.遇到一种新情况,有些按钮在htm ...

  6. solr 常见异常

    solr4.3本地数据提交异常分析 (2013-06-19 16:03:15) 转载▼   异常一. Exception in thread "main" java.lang.No ...

  7. KMS算法

    解题:http://hihocoder.com/problemset/problem/1015 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时 ...

  8. 关于Java虚拟机

    先占个坑,可以参考以下两篇文档来进行初步的学习 http://www.cnblogs.com/fingerboy/p/5456371.html http://www.importnew.com/244 ...

  9. myeclipse 安装svn(subeclipsesite)插件

    (1)到官网下载subeclipsesite,下载最新的版本:http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=224 ...

  10. 初探ABP--记一些常见的开发问题

    1.Update-Database : 无法将“Update-Database”项识别为 cmdlet.函数.脚本文件或可运行程序的名称.请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次. ...