CAS机制(多线程)
---- 什么是CAS机制
CAS机制主要是发生于Java中原子操作类(JUC)的底层实现中,其中在CAS机制中包含3个基本参数:内存地址V、旧预期值A、要修改的新值B。
当要更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同的时候,才会将内存地址V对应的值修改为B
举个栗子
- 在一个内存地址为V内存中,储存着变量值10(即此时A=10)
- 此时,来了一个线程A,想对该变量进行增加1操作(即此时对线程A来说:A=10,B=11)
- 但是,当线程A操作之前,被线程B插入率先将该变量进行修改成11(即此时A=11)
- 接着,等线程A想来修改的时候,通过内存地址V获取当前最新的值与自身线程的预期值进行比对(此时线程A的A=10),发现不一样,导致更新失败
- 线程A重新获取内存地址V的当前值,并重新计算想要修改的新值,即自旋操作。(此时对线程A来说,A=11,B=12)
- 这一次没有其他线程的干扰,线程A通过获取内存地址V的实际值,成功比较后,并且将内存地址V的值修改成12
--- 优点
由于Synchronized是个重量级别的锁,每次使用会引起用户态和核心态之间进行转换,在转换之间需要耗费很多的处理时间,所以,如果使用CAS机制,在并发不是很多的情况下,可以减少用户态和核心态进行切换,从而提高系统性能。
---缺点
- cpu开销大,在高并发下,许多线程,更新一变量,多次更新不成功,循环反复,给cpu带来大量压力
- 只是一个变量的原子性操作,不能保证代码块的原子性
- ABA问题(不过一般极少出现)
举个栗子(ABA问题)
- 小埋去存银行卡有200块钱,去提款机取钱100,恰巧机器有点问题,在进行取款提交操作后台开启了两个线程A和B(200->100)
- 线程A成功执行,而且线程B阻塞了,此时小埋银行卡的余额为100
- 此时,小埋的哥哥给她卡了打了100块,此时小埋银行卡的余额为200
- 然后,线程B此时就又开始执行了,发现卡里的余额200和自身线程余额期待值一样,进行修改(200->100)
- 最后,小埋就只能去找柜台寻求帮助了,因为正常情况下,她现在的卡里应该还有200块
如何解决aba问题:
对内存中的值加个版本号,在比较的时候除了比较值还的比较版本号。
参考资料:
《深入了解Java虚拟机》
CAS机制(多线程)的更多相关文章
- Java CAS同步机制 原理详解(为什么并发环境下的COUNT自增操作不安全): Atomic原子类底层用的不是传统意义的锁机制,而是无锁化的CAS机制,通过CAS机制保证多线程修改一个数值的安全性。
精彩理解: https://www.jianshu.com/p/21be831e851e ; https://blog.csdn.net/heyutao007/article/details/19 ...
- 多线程 | 03 | CAS机制
Compare and swap(CAS) 当前的处理器基本都支持CAS,只不过每个厂家所实现的算法并不一样罢了,每一个CAS操作过程都包含三个参数:一个内存地址V,一个期望的值A和一个新值B,操作的 ...
- 深入浅出Java并发包—CAS机制
在JDK1.5之前.Java主要靠synchronized这个关键字保证同步,已解决多线程下的线程不安全问题,但是这会导致锁的发生,会引发一些个性能问题. 锁主要存在一下问题 (1)在多线程竞争下,加 ...
- CAS机制与自旋锁
CAS(Compare-and-Swap),即比较并替换,java并发包中许多Atomic的类的底层原理都是CAS. 它的功能是判断内存中某个地址的值是否为预期值,如果是就改变成新值,整个过程具有原子 ...
- 什么是CAS机制?(转)
围绕下面四个点展开叙述: 一:什么是CAS机制? 二:Java当中CAS的底层实现 三:CAS的ABA问题和解决方法 四:java8对CAS的优化 一:什么是CAS机制? 我们先看一段代码: 启动两个 ...
- 对CAS机制的理解(一)
先看一段代码:启动两个线程,每个线程中让静态变量count循环累加100次. public class CountTest { public static int count = 0; public ...
- CAS机制总结
一.简介 CAS机制:(Compare and set)比较和替换 简单来说–>使用一个期望值来和当前变量的值进行比较,如果当前的变量值与我们期望的值相等,就用一个新的值来更新当前变量的值CAS ...
- 高并发之CAS机制和ABA问题
什么是CAS机制 CAS是英文单词Compare and Swap的缩写,翻译过来就是比较并替换 CAS机制中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B. 看如下几个例子: pac ...
- 并发编程的基石——CAS机制
本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 Java中提供了很多原子操作类来保证共享变量操作的原子性 ...
随机推荐
- Codeforces Round #355 (Div. 2)C - Vanya and Label
啊啊啊啊啊啊啊,真的是智障了... 这种题目,没有必要纠结来源.只要知道它的结果的导致直接原因?反正这句话就我听的懂吧... ">>"/"&" ...
- [Shader 着色器]冰霜效果的思考和实现
http://game.ceeger.com/forum/read.php?tid=23209&fid=2 由于最近要做一个冰系的角色,就想能不能做一些冰霜效果.那么就试试吧,先弄一张原图: ...
- C++ C# 默认对齐是8字节
C++ C# 默认对齐是8字节 以上,一直以为是4字节,尼玛
- elasticsearch映射 mapping
mapping的格式个应用,主要是创建索引(数据库)的时候指明type 的field类型,然后elasticsearch可以自动解析
- iSCSI 原理和基础使用
终于完成最后一篇了,一上午的时间就过去了. 下文主要是对基本操作和我对iSCSI的理解,网上有很多iSCSI原理,在这里我就不写了,请自行学习. 这篇文章仅对iSCSI的很多误解做一次梳理,你必须对所 ...
- print打印
print打印输出的优点是简单直接粗暴有效,就是用print()把可能有问题的变量打印出来看看缺点是将来还得删掉它,想想程序里到处都是print(),运行结果也会包含很多垃圾信息 __________ ...
- AppStore 审核拒绝原因记录
此文仅记录审核app被拒绝的原因 1.未提供充值功能,app中出现vip或者会员图标文字 被拒 解决,隐藏或取消该图标或文字 2.第三方登录,需要跳转到第三方app登录 被拒 解决,审核时隐藏第三方登 ...
- spring boot eureka client
eureka client @EnableDiscoveryClient @SpringBootApplication public class DemoApplication { public st ...
- AtCoder Grand Contest 018 D - Tree and Hamilton Path
题目传送门:https://agc018.contest.atcoder.jp/tasks/agc018_d 题目大意: 给定一棵\(N\)个点的带权树,求最长哈密顿路径(不重不漏经过每个点一次,两点 ...
- 数论/暴力 Codeforces Round #305 (Div. 2) C. Mike and Frog
题目传送门 /* 数论/暴力:找出第一次到a1,a2的次数,再找到完整周期p1,p2,然后以2*m为范围 t1,t2为各自起点开始“赛跑”,谁落后谁加一个周期,等到t1 == t2结束 详细解释:ht ...