---- 什么是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. Codeforces Round #355 (Div. 2)C - Vanya and Label

    啊啊啊啊啊啊啊,真的是智障了... 这种题目,没有必要纠结来源.只要知道它的结果的导致直接原因?反正这句话就我听的懂吧... ">>"/"&" ...

  2. [Shader 着色器]冰霜效果的思考和实现

    http://game.ceeger.com/forum/read.php?tid=23209&fid=2 由于最近要做一个冰系的角色,就想能不能做一些冰霜效果.那么就试试吧,先弄一张原图: ...

  3. C++ C# 默认对齐是8字节

    C++ C# 默认对齐是8字节 以上,一直以为是4字节,尼玛

  4. elasticsearch映射 mapping

    mapping的格式个应用,主要是创建索引(数据库)的时候指明type 的field类型,然后elasticsearch可以自动解析

  5. iSCSI 原理和基础使用

    终于完成最后一篇了,一上午的时间就过去了. 下文主要是对基本操作和我对iSCSI的理解,网上有很多iSCSI原理,在这里我就不写了,请自行学习. 这篇文章仅对iSCSI的很多误解做一次梳理,你必须对所 ...

  6. print打印

    print打印输出的优点是简单直接粗暴有效,就是用print()把可能有问题的变量打印出来看看缺点是将来还得删掉它,想想程序里到处都是print(),运行结果也会包含很多垃圾信息 __________ ...

  7. AppStore 审核拒绝原因记录

    此文仅记录审核app被拒绝的原因 1.未提供充值功能,app中出现vip或者会员图标文字 被拒 解决,隐藏或取消该图标或文字 2.第三方登录,需要跳转到第三方app登录 被拒 解决,审核时隐藏第三方登 ...

  8. spring boot eureka client

    eureka client @EnableDiscoveryClient @SpringBootApplication public class DemoApplication { public st ...

  9. AtCoder Grand Contest 018 D - Tree and Hamilton Path

    题目传送门:https://agc018.contest.atcoder.jp/tasks/agc018_d 题目大意: 给定一棵\(N\)个点的带权树,求最长哈密顿路径(不重不漏经过每个点一次,两点 ...

  10. 数论/暴力 Codeforces Round #305 (Div. 2) C. Mike and Frog

    题目传送门 /* 数论/暴力:找出第一次到a1,a2的次数,再找到完整周期p1,p2,然后以2*m为范围 t1,t2为各自起点开始“赛跑”,谁落后谁加一个周期,等到t1 == t2结束 详细解释:ht ...