Java中的CAS原理
前言:在对AQS框架进行分析的过程中发现了很多CAS操作,因此有必要对CAS进行一个梳理,也便更清楚的了解其原理。
1.CAS是什么
CAS,是compare and swap的缩写,中文含义:比较交换。
CAS操作包含三个操作数——需要读写的内存值(V)、预期原值[进行比较的值](A)和新值(B)。如果V的值与A值匹配时,那么就将该内存位置的值更新为新值,否则不做任何操作。
CAS用于同步的方式是从地址V处读取值A,在执行一些列计算后获得新值B,如果此时内存V处的值和预期值A相等,则将V处值更新为B,此时CAS操作成功。
2.CAS原理
在intel的CPU中,Java CAS操作通过cmpxchg指令来完成原子操作,通过JNI来完成非阻塞算法,J.U.C包都建立在CAS上,对比synchronized阻塞算法,通过CAS在性能上有了很大的提升。
CAS的操作都集中在Unsafe类中,这里看compareAndSwapInt的源码:
通过源码可以看出该方法为native的,它会去调底层的C++代码。对应intel x86处理器源代码片段:
os::is_MP()命令会根据当前处理器类型来决定是否为cmpxchg指令添加lock前缀。如果是多处理器,就会在cmpxchg指令前加上lock前缀,否则单处理器按书序一致性执行,不需要内存屏障的效果。
3.CAS的缺点
CAS虽然可以很高效的解决原子操作问题,但它仍然存在三大问题。
#1.ABA问题
ABA问题产生的原因:CAS操作的时候需要检查值有没有发生变化,如果没有发生变化则进行更新,但如果一个值原来是A,接着变成B,后来又变成A,在CAS操作的时候会发现它的值没有发生变化,但实际上值发生了变化。因此这种操作是有问题的。
解决思路:使用版本号。在变量前面追加上版本号,每次变量更新的时候把版本号自增,那么A-B-A 就会变成1A-2B-3A。从Java1.5开始JDK的atomic包里提供了一个类AtomicStampedReference来解决ABA问题。这个类的compareAndSet方法作用是首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。
#2.循环时间开销大
自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销。
#3.只能保证一个共享变量的原子操作
因为Java中的CAS操作只是对CPU的cmpxchg指令的一层封装,它的功能就是一次只能原子的修改一个变量,可以加锁来解决这个问题。或者利用AtomicReference把多个变量放入一个对象中进行CAS操作。
总结
对于CAS记住比较交换,相同则更新,以及CAS的在AQS的重要地位。
参考:
https://blog.52itstyle.com/archives/948/
by Shawn Chen, 2019.1.30日,下午。
Java中的CAS原理的更多相关文章
- Java中的CAS实现原理
一.什么是CAS? 在计算机科学中,比较和交换(Conmpare And Swap)是用于实现多线程同步的原子指令. 它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新 ...
- Java并发--Java中的CAS操作和实现原理
版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/CringKong/article/deta ...
- 沉淀再出发:java中的CAS和ABA问题整理
沉淀再出发:java中的CAS和ABA问题整理 一.前言 在多并发程序设计之中,我们不得不面对并发.互斥.竞争.死锁.资源抢占等等问题,归根到底就是读写的问题,有了读写才有了增删改查,才有了所有的一切 ...
- java高并发系列 - 第21天:java中的CAS操作,java并发的基石
这是java高并发系列第21篇文章. 本文主要内容 从网站计数器实现中一步步引出CAS操作 介绍java中的CAS及CAS可能存在的问题 悲观锁和乐观锁的一些介绍及数据库乐观锁的一个常见示例 使用ja ...
- 深入介绍Java中的锁[原理、锁优化、CAS、AQS]
1.为什么要用锁? 锁-是为了解决并发操作引起的脏读.数据不一致的问题. 2.锁实现的基本原理 2.1.volatile Java编程语言允许线程访问共享变量, 为了确保共享变量能被准确和一致地更新, ...
- Java中的锁[原理、锁优化、CAS、AQS]
1.为什么要用锁? 锁-是为了解决并发操作引起的脏读.数据不一致的问题. 2.锁实现的基本原理 2.1.volatile Java编程语言允许线程访问共享变量, 为了确保共享变量能被准确和一致地更新, ...
- Java中的锁原理、锁优化、CAS、AQS详解!
阅读本文大概需要 2.8 分钟. 来源:jianshu.com/p/e674ee68fd3f 一.为什么要用锁? 锁-是为了解决并发操作引起的脏读.数据不一致的问题. 二.锁实现的基本原理 2.1.v ...
- Java 中的锁原理、锁优化、CAS、AQS 详解!(转)
1.为什么要用锁? 锁-是为了解决并发操作引起的脏读.数据不一致的问题. 2.锁实现的基本原理 2.1.volatile Java编程语言允许线程访问共享变量, 为了确保共享变量能被准确和一致地更新, ...
- Java 中的锁原理、锁优化、CAS、AQS 详解!
来源:jianshu.com/p/e674ee68fd3f 1.为什么要用锁? 锁-是为了解决并发操作引起的脏读.数据不一致的问题. 2.锁实现的基本原理 2.1.volatile Java编程语言允 ...
随机推荐
- JDK源码分析(4)之 LinkedList 相关
LinkedList的源码大致分三个部分,双向循环链表的实现.List的API和Deque的API. 一.定义 public class LinkedList<E> extends Abs ...
- Spring Boot 2.x(六):优雅的统一返回值
目录 为什么要统一返回值 ReturnVO ReturnCode 使用ReturnVO 使用AOP进行全局异常的处理 云撸猫 公众号 为什么要统一返回值 在我们做后端应用的时候,前后端分离的情况下,我 ...
- IO通信模型(三)多路复用IO
多路复用IO 从非阻塞同步IO的介绍中可以发现,为每一个接入创建一个线程在请求很多的情况下不那么适用了,因为这会渐渐耗尽服务器的资源,人们也都意识到了这个 问题,因此终于有人发明了IO多路复用.最大的 ...
- [转]Centos 7搭建Gitlab服务器超详细
本文转自:https://blog.csdn.net/duyusean/article/details/80011540 可参考:https://about.gitlab.com/install/#c ...
- EF 的 CURD 操作
EF 的 CURD 操作 这里采用了数据库 Northwind,下载地址:https://northwinddatabase.codeplex.com/ 增 /// <summary> / ...
- 杭电ACM2014--青年歌手大奖赛_评委会打分
青年歌手大奖赛_评委会打分 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- 【开源】SpringBootNetty聊天室V1.2.0升级版本介绍
前言 SpringBoot!微服务微架构的基础,Netty通信框架的元老级别框架,即之前的SpringBoot与Netty的实现聊天室的功能后已经过了不到一周的时间啦,今天我们更新了项目版本从V1.0 ...
- 【代码笔记】Web-CSS-CSS Float(浮动)
一, 效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- vue 音乐App QQ音乐搜索列表最新接口跨域设置
在 webpack.dev.config.js中 'use strict' const utils = require('./utils') const webpack = require('webp ...
- ios屏幕怎么投屏到电脑显示器
iphone在国内一直都很受欢迎,为什么这么受欢迎呢?其实苹果手机操作系统非常的新颖,让人对手机有了重新的认识.但是ios屏幕怎么投屏到电脑显示器.感兴趣的一起阅读下面的内容吧! 使用工具: 苹果手机 ...