CAS知识点讲解

简介: CAS知识点讲解

什么是CAS?

CAS全称 Compare And Swap ,比较与交换,是乐观锁的主要实现方式。CAS在不使用锁的情况下实现 多线程之间的变量同步。 ReentrantLock 内部的AQS和原子类内部都使用了CAS。

CAS算法涉及到三个操作数:

  • 需要读写的内存值V。
  • 进行比较的值A。
  • 要写入的新值B。

只有当V的值等于A时,才会使用原子方式用新值B来更新V的值,否则会继续重试直到成功更新值。

以 AtomicInteger 为例, AtomicInteger 的 getAndIncrement() 方法底层就是CAS实现,关键代码是 compareAndSwapInt(obj, offset, expect, update) ,其含义就是,如果 obj 内的 value 和 expect 相等,就证明没有其他线程改变过这个变量,那么就更新它为 update ,如果不相等,那就会继 续重试直到成功更新值。

CAS存在的问题?

CAS 三大问题:

1. ABA问题。CAS需要在操作值的时候检查内存值是否发生变化,没有发生变化才会更新内存值。但 是如果内存值原来是A,后来变成了B,然后又变成了A,那么CAS进行检查时会发现值没有发生变 化,但是实际上是有变化的。ABA问题的解决思路就是在变量前面添加版本号,每次变量更新的时 候都把版本号加一,这样变化过程就从 A-B-A 变成了 1A-2B-3A 。 JDK从1.5开始提供了AtomicStampedReference类来解决ABA问题,原子更新带有版本号的引用类 型。

2. 循环时间长开销大。CAS操作如果长时间不成功,会导致其一直自旋,给CPU带来非常大的开销。

3. 只能保证一个共享变量的原子操作。对一个共享变量执行操作时,CAS能够保证原子操作,但是对 多个共享变量操作时,CAS是无法保证操作的原子性的。 Java从1.5开始JDK提供了AtomicReference类来保证引用对象之间的原子性,可以把多个变量放在 一个对象里来进行CAS操作。

相关文章
|
Kubernetes 容器 Perl
k8s查看日志命令—2023.02
k8s查看日志命令—2023.02
368 0
|
12月前
|
算法 安全 NoSQL
介绍一下CAS模型
【10月更文挑战第20天】介绍一下CAS模型
324 0
|
6月前
|
虚拟化 iOS开发 MacOS
VMware ESXi 8.0U3e macOS Unlocker & OEM BIOS 集成驱动版,新增 12 款 I219 网卡驱动
VMware ESXi 8.0U3e macOS Unlocker & OEM BIOS 集成驱动版,新增 12 款 I219 网卡驱动
285 15
|
数据采集 弹性计算 供应链
阿里云ECS付费类型:包年包月、按量付费和抢占式实例区别详解
阿里云服务器付费模式:包年包月适合长期稳定服务,价格优惠;按量付费适合短期或波动需求,按小时计费;抢占式实例价格低但可能被系统释放,适合无状态应用。选择取决于业务场景和资源稳定性需求。
371 0
|
达摩院 Linux Docker
MindOpt APL 最新版本功能介绍,并且开放下载使用了!
MindOpt APL (MAPL) 是由阿里巴巴达摩院研发的国产建模语言,专长于电力SCUC等问题,提供向量化建模支持,可与Mindopt Studio平台集成。最新版2.4增加了向量化建模、Linux环境下通过pip安装支持以及改进了打印显示和错误提示。MAPL的向量化建模提高了效率,适合大规模问题。用户可通过云平台Docker打包或pip安装使用,支持多种求解器,包括MindOpt和开源求解器。
|
存储 缓存 前端开发
女朋友不想开Processon会员,我魔改了一个无限制的在线绘图软件
女朋友不想开Processon会员,我魔改了一个无限制的在线绘图软件
|
机器学习/深度学习 自然语言处理
神经网络的权值共享有哪些方式
神经网络的权值共享有哪些方式
287 0
|
监控 Cloud Native Docker
云原生之使用docker部署uptime-kuma服务器监控面板
云原生之使用docker部署uptime-kuma服务器监控面板
882 3
vos3000与呼叫中心系统的关系你了解多少
呼叫中心系统和VOS的关系:呼叫中心系统是用于提供VoIP通讯服务的一个平台VOS是一个用于给呼叫中心系统做计费的软件两者都运用的是软交换技术。