当前位置: 首页 > news >正文

一文了解CAS

什么是CAS?

CAS全程:Compare And Swap(比较并交换),是乐观锁思想的一种体现,能在无锁的情况下保证线程安全。

Java中的CAS是由native方法实现的,底层通过硬件层面保证了CAS操作的原子性。

CAS是如何保证线程安全的?如下:

CAS操作会去比较工作内存中的旧值和内存中的预期值是否相等,相等才会将其改成新值。如下线程A来修改a,a旧值是100,去和主内存中的a比较,发现相等了,于是在工作内存进行a++操作并同步到主内存。


此时线程B也来修改a,但是旧值是100与主内存中101不相等,就会修改失败,CAS一般会搭配自旋,因此线程B会再次进行CAS,直至成功或者达到最大自旋次数。

CAS的优缺点?

CAS的优点就是无锁操作,线程不会阻塞,不用进行上下文切换,性能好。
缺点有ABA、循环时间过长性能开销、只能单变量原子性等问题。

ABA问题

ABA问题指如果一个值被修改了之后又被改回去了,那么CAS是无法发现值被修改了的。解决办法就是给数据加上一个版本号或者时间戳。
 

循环时间过长导致的性能开销

CAS自旋次数过多会给cpu带来很大的性能消耗。

解决思路是让 JVM 支持处理器提供的pause 指令

pause 指令能让自旋失败时 cpu 睡眠一小段时间再继续自旋,从而使得读操作的频率降低很多,为解决内存顺序冲突而导致的 CPU 流水线重排的代价也会小很多。

只能保证单一变量的原子性

CAS操作无法保证多个变量的的原子性。

AtomicReference类保证对象的原子性,可以将多个变量放入对象中,对单一对象进行CAS操作。

相关文章:

  • 图片标注及流程
  • 如何使用Python的matplotlib.pyplot绘制热图和损失图
  • 二进制数(十进制转二进制)
  • ObjC NSString字符串常量编码格式是编译器决定还是ObjC语言规范决定?字符串默认编码?
  • 【VUE】day02-vue过滤器、计算属性、vue-cli、vue组件
  • ST电机库电流采样 三电阻单ADC
  • 【论文笔记】FFA-Net: Feature Fusion Attention Network for Single Image Dehazing
  • Powershell如何查询 windows defender是否开启
  • 数据库小练习
  • 函数式编程定义
  • 【Msq8.0无需登陆进行重置密码】
  • 数学建模 第一节
  • PAT甲级(Advanced Level) Practice 1019 General Palindromic Number
  • Next.js项目MindAI教程 - 第六章:在线咨询功能
  • Keil5下载教程及安装教程(附安装包)
  • 小说文本分析工具:基于streamlit实现的文本分析
  • Python依赖包迁移到断网环境安装
  • 【GPT入门】第22课 langchain LCEL介绍
  • 基于SpringBoot和Thymeleaf的仿商城系统开发与设计
  • HTB 学习笔记 【中/英】《前端 vs. 后端》P3
  • 制定出台民营经济促进法有何重大意义?全国人大常委会法工委回应
  • 向总书记汇报具身智能发展的“稚辉君”:从期待到兴奋再到备受鼓舞
  • 农行一季度净利润719亿元增2.2%,不良率微降至1.28%
  • 张元济和百日维新
  • 马上评丨学生举报食堂饭菜有蛆,教育局应该护谁的犊子
  • 传智教育连续3个交易日跌停:去年净利润由盈转亏