简单理解CAS以及compareAndSet

简介:

CAS:Compare and Swap, 比较并交换。

CAS的作用是将指定内存地址的内容与所给的某个值相比,如果相等,则将其内容替换为指令中提供的新值,如果不相等,则更新失败。这一比较并交换的操作是原子的,不可以被中断。CAS是通过硬件命令保证了原子性,且硬件级别的原子性比高级语言的软件级别的运行速度要快地多。虽然CAS也包含了多个操作,但其的运算是固定的(就是个比较),这样的锁定性能开销很小。

CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
image.png

CAS有效地说明了“我认为位置V应该包含值A;如果包含该值,则将B放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。

AtomicInteger类compareAndSet通过原子操作实现了CAS操作,最底层基于汇编语言实现。
public final boolean compareAndSet(V expect, V update)
工作原理如图:image.png
内存值跟期望值相同时,
true.png
内存值跟期望值不同时,false.png

目录
相关文章
|
存储 Shell Linux
快速上手基于 BaGet 的脚本自动化构建 .net 应用打包
本文介绍了如何使用脚本自动化构建 `.net` 应用的 `nuget` 包并推送到指定服务仓库。首先概述了 `BaGet`——一个开源、轻量级且高性能的 `NuGet` 服务器,支持多种存储后端及配置选项。接着详细描述了 `BaGet` 的安装、配置及使用方法,并提供了 `PowerShell` 和 `Bash` 脚本实例,用于自动化推送 `.nupkg` 文件。最后总结了 `BaGet` 的优势及其在实际部署中的便捷性。
640 10
Layui 内置方法 - layer.closeAll(关闭所有层)
Layui 内置方法 - layer.closeAll(关闭所有层)
489 0
|
2月前
|
存储 人工智能 安全
函数计算进化之路:AI Sandbox 新基座
AI Agent Sandbox 是应对 AI 代理自主性风险的关键技术,提供安全隔离环境以执行代码、交互应用和处理敏感数据。它解决了三大挑战:隔离与安全、状态管理与成本、可扩展性与运维。阿里云函数计算凭借物理隔离架构、Serverless 弹性与成本优势,结合会话亲和、隔离及存储安全等创新能力,成为 AI Agent Sandbox 的理想运行时平台,助力 AI 技术安全落地与商业化发展。
|
6月前
|
XML 语音技术 Android开发
Android中TextToSpeech的使用
本文介绍了在Android开发中使用TextToSpeech(TTS)实现语音合成的功能。通过实例代码展示了TTS的初始化、语言设置、语音播放及队列模式的选择,并提供了将语音保存为音频文件的方法。项目中包含一个简单的按钮触发朗读功能,适合初学者学习和实践。代码示例完整,涵盖Activity生命周期管理与XML布局设计。
463 4
|
存储 负载均衡 NoSQL
一文让你搞懂 zookeeper
一文让你搞懂 zookeeper
18225 16
|
前端开发 对象存储
基于RuoYi-Flowable-Plus的ruoyi-nbcio项目的formdesigner文件上传与回显处理
基于RuoYi-Flowable-Plus的ruoyi-nbcio项目的formdesigner文件上传与回显处理
273 0
|
安全 Java 定位技术
Android 浅度解析:AIDL & Binder (1)
Android 浅度解析:AIDL & Binder (1)
688 0
|
关系型数据库 MySQL Linux
Packet for query is too large (4467936 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable
【10月更文挑战第15天】解决Packet for query is too large (4467936 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable
531 1
|
机器人 芯片
ChatGPT提问技巧——对话提示
ChatGPT提问技巧——对话提示
1201 8
|
Java Maven
解决IntelliJ IDEA执行maven打包,执行java -jar命令提示jar中没有主清单属性
执行`java -jar app.jar`命令后,提示jar中没有主清单属性
4785 1