CAS(Compare-and-Swap),即比较并替换,是一种实现并发算法时常用到的技术,Java并发包中的很多类都使用了CAS技术。
CAS需要有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B。
CAS指令执行时,当且仅当内存地址V的值与预期值A相等时,将内存地址V的值修改为B,否则就什么都不做。整个比较并替换的操作是一个原子操作。

CAS指令 和 同步锁 在底层是使用不同的指令操作。

例如 intel手册对lock前缀的说明如下:
1.确保对内存的读-改-写操作原子执行。在Pentium及Pentium之前的处理器中,带有lock前缀的指令在执行期间会锁住总线,使得其他处理器暂时无法通过总线访问内存。很显然,这会带来昂贵的开销。从Pentium 4,Intel Xeon及P6处理器开始,intel在原有总线锁的基础上做了一个很有意义的优化:如果要访问的内存区域(area of memory)在lock前缀指令执行期间已经在处理器内部的缓存中被锁定(即包含该内存区域的缓存行当前处于独占或以修改状态),并且该内存区域被完全包含在单个缓存行(cache line)中,那么处理器将直接执行该指令。由于在指令执行期间该缓存行会一直被锁定,其它处理器无法读/写该指令要访问的内存区域,因此能保证指令执行的原子性。这个操作过程叫做缓存锁定(cache locking),缓存锁定将大大降低lock前缀指令的执行开销,但是当多处理器之间的竞争程度很高或者指令访问的内存地址未对齐时,仍然会锁住总线。
2.禁止该指令与之前和之后的读和写指令重排序。
3.把写缓冲区中的所有数据刷新到内存中。、

CAS的缺点:
CAS虽然很高效的解决了原子操作问题,但是CAS仍然存在三大问题。

1.循环时间长开销很大。
2.只能保证一个共享变量的原子操作。
3.ABA问题。

具体请看原作者
---------------------
作者:程序员囧辉
来源:CSDN
原文:https://blog.csdn.net/v123411739/article/details/79561458
版权声明:本文为博主原创文章,转载请附上博文链接!

最新文章

  1. Linux平台 Oracle 11gR2 RAC安装Part1:准备工作
  2. fsr
  3. HandlerMapping的3种访问形式
  4. CSS3弹力球
  5. C++—函数探幽
  6. 20、内存溢出(Out of Memory)
  7. Python 文件的IO
  8. 转 - Web新人(偏前端)应该怎样学习(个人观点,勿喷)
  9. RabbitMQ基本管理(上)
  10. 构建一个真实的应用电子商务SportsStore(十)
  11. 开源前端脚本错误监控及跟踪解决项目BadJS试用
  12. spark-2.4.0-hadoop2.7-安装部署
  13. Spring配置从配置文件读取属性值
  14. 浪里个浪 FZU - 2261
  15. sql中的STRFTIME
  16. ORACLE实用函数之一 ratio_to_report的简单使用
  17. c# 利用AForge和百度AI开发实时人脸识别
  18. Educational Codeforces Round 63 (Rated for Div. 2) 题解
  19. vivado sdk生成elf文件出错:make: Interrupt/Exception caught (code = 0xc00000fd, addr = 0x4227d3)
  20. Oracle exp,imp,expdp,impdp数据导入导出

热门文章

  1. 设置浏览器让js报错
  2. hibernate_08_关联映射_一对多
  3. Verification之PSL之intro
  4. Assembly之instruction之JUMP
  5. python处理中文编码
  6. 初识cocos creator的一些问题
  7. .Net Core 中X509Certificate2 私钥保存为 pem 的方法
  8. 下拉框处理(select)
  9. Proc、宿主变量、指示变量、数组变量、通信区sqlca,oraca ---(day07)
  10. Linux思维导图之sed、实战习题