CAS 分析
2018-06-18 01:23:10来源:未知 阅读 ()
CAS是什么
(1) CAS(Compare and Swap) 比较并交换, 比较并交换是在多线程并发时用到的一种技术
(2) CAS是原子操作, 保证并发安全性, 而不是保证并发同步.
(3) CAS是一个CPU指令
(4) CAS是一种非阻塞的轻量级乐观锁
什么是乐观锁和悲观锁
乐观锁, 严格来讲并不是锁, 他是通过原子性来保证数据的同步, 乐观的认为在数据操作期间没有其他线程影响. 而悲观锁例如: synchronize 认为在数据操作期间一定会有其他线程影响, 所以会通过并发同步的方式来保证数据的正确. 所以CAS不会保证线程同步, 乐观地认为在数据更新期间没有其他线程影响.
CAS原理
CAS, 比较并交换, 是将内存值更新为需要的值, 但是有个条件, 就是内存值必须与期望值相同. 例如: 期望值 E, 工作内存值 M , 更新值 U, 只有 当 E == M 时, 将M 更新为U.
CAS应用
由于CAS是CPU指令,我们只能通过JNI与操作系统交互,关于CAS的方法都在sun.misc包下Unsafe的类里 java.util.concurrent.atomic包下的原子类等通过CAS来实现原子操作。
CAS指令
原子类例如AtomicInteger, 其中的getAndIncrement方法就用了CAS.
public final int getAndIncrement() { //主要看这个getAndAddInt方法 return unsafe.getAndAddInt(this, valueOffset, 1); } //var1 是this指针 //var2 是地址偏移量 //var4 是自增的数值,是自增1还是自增N public final int getAndAddInt(Object var1, long var2, int var4) { int var5; do { //获取主内存值,这是内存值已经是旧的,假设我们称作期望值E var5 = this.getIntVolatile(var1, var2); //var5是期望值E,var5 + var4是要更新的值 //这个操作就是调用CAS的JNI,每个线程将自己内存里的内存值M和期望值E作比较, //如果相同将内存值M更新为var5 + var4,并同步到主内存, 否则做自旋操 } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4)); return var5; }
流程:
1. 假设有两个线程: A, B
2. jvm 中主内存为1 , A, B 线程的工作内存为1 (工作内存会拷贝一份主内存的值)
3. 当前期望值E为1 , A, B 两个线程做+1操作
4. 执行到getAndAddInt方法, var5 = 1 , var4 = 1,
(1) A线程将var5 与工作内存值M比较, 比较var5 是否等于1
(2) 如果相等, 则将工作内存值更新为 var5+var4 , 并更新到主内存, 此时this指针的value = 2
(3) 如果不相等, 说明B线程先A线程进行了更新操作, 这时主内存值 = 2, A线程未更新成功继续循环, var5 更新为新主内存值 = 2, 因为this指针的value用volatile 修饰, 所以更新为2, 这时继续将 var5 与工作内存值M比较, 比较var5 是否等于 2 , 相等则将工作内存值更新为var5 + var4, 并更新到主内存, 此时this指针的value = 3; 主内存值为3;
(4) 如果一直不相等, 重复第三步直到相等退出更新.
CAS 优缺点
- 优点
非阻塞的轻量级乐观锁, 通过CPU指令实现, 在资源竞争不激烈的情况下性能高, 相比synchronize重量级悲观锁, synchronize有复杂的加锁, 解锁和唤醒线程操作.
- 缺点
(1) ABA 问题, 线程1, 2. 线程1 将A修改为B后又修改为A, 此时线程2以为A没有改变过. 而 J巴德原子类AtomicStampedReference, 通过控制变量值的版本来保证CAS的正确性.
(2) 自旋时间过长, 消耗CPU资源, 如果资源竞争激烈, 啧多线程自旋时间长消耗资源.
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 数据结构:用实例分析ArrayList与LinkedList的读写性能 2020-06-04
- 数据分析 | 数据可视化图表,BI工具构建逻辑 2020-06-02
- Docker Swarm与Kubernetes对比分析如何选择? 2020-06-02
- 数据分析 | 基于智能标签,精准管理数据 2020-05-30
- 高吞吐量的分布式发布订阅消息系统Kafka之Producer源码分析 2020-05-30
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash