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

一文了解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操作。


http://www.kler.cn/a/586982.html

相关文章:

  • linux 命令 ls
  • 网络爬虫【简介】
  • 基于vue-grid-layout 实现自定义首页视图
  • Tailwindcss开启黑夜模式
  • Python扑克牌游戏更新哦~【增加更多牌类】
  • 获取golang变量的类型
  • Redis分片集群
  • 机器学习与深度学习中模型训练时常用的四种正则化技术L1,L2,L21,ElasticNet
  • springboot集成flink实现DM数据库同步到ES
  • RabbitMq C++客户端的使用
  • 使用SetupTools 管理你的项目打包工作
  • 如何用URDF文件构建机械手模型并与MoveIt集成
  • 【Tools】Visual Studio Code安装保姆级教程(2025版)
  • Typora最新版破解教程
  • 音视频入门基础:RTP专题(20)——通过FFprobe显示RTP流每个packet的信息
  • PHP与MySQL的高效数据交互:最佳实践与优化技巧
  • 解锁 vue-property-decorator 的秘密:Vue 2 到 Vue 3 的 TypeScript 之旅!✨
  • Kubernetes学习笔记-移除Nacos迁移至K8s
  • svmspro如何切换数据库
  • 【2025最新】深度学习框架PyTorch——从入门到精通(1)下载与安装