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

CAS的三大问题和解决方案

一、ABA问题的解决方案

变量第一次读取的值是1,后来其他线程改成了3,然后又被其他线程修改成了1,原来期望的值是第一个1才会设置新值,第二个1跟期望不符合,但是,可以设置新值。

解决方案:

(a)增加一个自定义的版本号变量,记录修改日志,每次修改一次,就加1 。当值相同时,还要比较版本号,如果版本号也一样,才能更新成新的值。
(b)采用原子引用类 AtomicStampedReference,通过控制变量值的版本号,来确保CAS的正确性,比较两个值引用是否一致,只有一致才会更新成新值。

二、无限循环问题(自旋)的解决方案

底层使用一个while循环来实现的,所以Atomic类设置值进入一个无限循环,只要失败了就不停的循环,再次疯狂的尝试。高并发场景下,多个线程频繁修改同一个值,则会导致大量线程执行compareAndSet的方法时,要循环 n 次才能更新成功,就是大量线程执行一个重复的空循环(自旋锁),造成系统的大量开销。

解决方案:

(a)采用 jdk 8 中的 LongAdder,分段CAS + 自动分段迁移。

三、多原子的变量问题的解决方案

一般的Atomic类,只能保证一个共享变量的原子性。

解决方案:

(a)采用 java 并发包的 AtomicReference,这个是封装自定义对象的,多个变量可放一个自定义对象中,然后它会检查该对象的引用是否是相同。如果多个线程,同时对一个对象变量的引用进行修改,AtomicReference 的 CAS 算法可解决并发冲突问题。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Unity UGUI 之 坐标转换
  • C++20之设计模式:状态模式
  • 新校区,新视野——广州六中以太彩光打造智慧教育新高地
  • Node.js知识点总结
  • 基于Neo4j将知识图谱用于检索增强生成:Knowledge Graphs for RAG
  • 【linux深入剖析】命名管道 | 匿名管道与命名管道的区别 | system V共享内存
  • 刷题计划 day4 【双指针、快慢指针、环形链表】链表下
  • MySQL字段设置的varchar长度小于数据长度自动截取丢弃超出的长度而不是报错?
  • 【JavaScript】深入理解 `let`、`var` 和 `const`
  • 文件包涵条件竞争(ctfshow82)
  • 基于微信小程序+SpringBoot+Vue的美食推荐平台(带1w+文档)
  • 音乐曲谱软件Guitar Pro 8.2 for Mac 中文破解版
  • JavaScript性能优化与调试
  • Vue前端页面嵌入mermaid图表--流程图
  • 探索二进制翻译,openKylin成功在RISC-V平台运行X86架构软件!
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • java 多线程基础, 我觉得还是有必要看看的
  • Javascript设计模式学习之Observer(观察者)模式
  • leetcode-27. Remove Element
  • 关于List、List?、ListObject的区别
  • 官方解决所有 npm 全局安装权限问题
  • 规范化安全开发 KOA 手脚架
  • 深度学习在携程攻略社区的应用
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 网络应用优化——时延与带宽
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • C# - 为值类型重定义相等性
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • # .NET Framework中使用命名管道进行进程间通信
  • # Panda3d 碰撞检测系统介绍
  • #### golang中【堆】的使用及底层 ####
  • (10)STL算法之搜索(二) 二分查找
  • (2022 CVPR) Unbiased Teacher v2
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (pytorch进阶之路)扩散概率模型
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (多级缓存)缓存同步
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (论文阅读40-45)图像描述1
  • (十六)Flask之蓝图
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • .net SqlSugarHelper
  • .net web项目 调用webService
  • .netcore 获取appsettings
  • .net项目IIS、VS 附加进程调试
  • .sdf和.msp文件读取
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [001-03-007].第07节:Redis中的事务