什么是CAS

CAS(Compare and swap),字面意思可以理解为“比较和交换”:
它其实就是假设内存中原有的数据为 V ,旧的预期值为 A 需要修改的值为 B,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。

当多个线程同时对某个资源进行CAS操作,只能有一个线程操作成功,但是并不会阻塞其他线程,其他线
程只会收到操作失败的信号。可见 CAS 其实是一个乐观锁。

通俗的将就是针对某个内存地址的内容,猜一下里面的值,如果猜对了,就将这个值更换成一个新的值,如果猜错了,就啥也不干(这一系列都是原子操作,而操作系统/硬件设备是赋予应用程序的一种进行原子操作的力量源泉之一)

话不多说,来看看下面这个例子


CAS的效率很高,有的时候为了实现线程的安全,同时又尽可能的提高效率,CAS往往是一种更好的选择(无锁编程)。

CAS的典型场景——无锁编程

无锁编程也是为了保证线程的安全,之前可能为了保证线程安全就会加锁,但是有的情况下加锁开销比较大(即便sychronized锁内置了很多的优化策略,但是还是比较大),所以这就要使用CAS

话不多说,在看例子
例如,想完成一个线程安全的 i++操作(CAS实现)


是不是看不懂,不要紧,咱给你画图解答

Atomic操作类(原子操作)

因为int long……等内置类型他的++操作或者–操作都不是原子操作,这是我们就可以使用java中的原子操作类,所谓的原子操作类本质上就是提供了原子的++或者–等操作(本质上就是对CAS进行了封装,然后提供了一组现成的类)

可以通过CAS实现在用户态实现轻量级锁/自旋锁

CAS缺点——ABA问题

首先什么是ABA问题:就是一个值从A变成了B又变成了A,而这个期间我们不清楚这个过程。

如何解决ABA问题呢?

答:既然要解决ABA问题,就需要引入额外的代价
给 i 这个变量关联一个“版本号”,每次修改,版本号就+1,就可以根据版本号来区分当前的是否被修改过了

可供参考文章

++操作你还在使用加锁去保证线程的安全吗?确定不了解一下CAS机制?相关推荐

  1. 它又来了!C**HashMap是如何保证线程安全的?会用不就完了?

    欢迎关注方志朋的博客,回复"666"获面试宝典 阅读此篇文章,你需要有以下知识基础 Java内存模型,可见性问题 CAS HashMap底层原理 我们知道,在日常开发中使用的Has ...

  2. ConcurrentHashMap是如何保证线程安全的,你知道么?

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/qq_41737716/ article/details/90549847 前言 阅读此篇文章,你需要有以下知识基础 Java内 ...

  3. 精妙绝伦的并发艺术品 — ConcurrentHashMap是如何保证线程安全的

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 | 前言 阅读此 ...

  4. ConcurrentHashMap 是如何保证线程安全的,你知道么?

    点击下方"IT牧场",选择"设为星标" blog.csdn.net/qq_41737716/article/details/90549847 01.前言 02. ...

  5. 静态内部类的单例模式如何保证线程安全

    一,单例模式有6种实现方式: 1.懒汉式: 2.懒汉式-加锁: 3.双重检验锁: 4.饿汉式: 5.静态内部类: 6.枚举: 1.懒汉式: public class Singleton { //私有的 ...

  6. 面试官:ConcurrentHashMap 是如何保证线程安全的

    点击"终码一生",关注,置顶公众号 每日技术干货,第一时间送达! 1.前言 阅读此篇文章,你需要有以下知识基础 Java内存模型,可见性问题 CAS HashMap底层原理 我们知 ...

  7. 分布式环境下,怎么保证线程安全

    转:https://blog.csdn.net/Faker_Wang/article/details/80798732 避免并发 在分布式环境中,如果存在并发问题,那么很难通过技术去解决,或者解决的代 ...

  8. ConcurrentHashMap是如何保证线程安全的?

    ConcurrentHashMap相当于是HashMap的多线程版本,它的功能本质上和HashMap没什么区别.因为HashMap在并发操作的时候会出现各种问题,比如死循环问题.数据覆盖等问题.而这些 ...

  9. shiro如何保证session不失效_请问在不加锁的情况下如何保证线程安全?

    概念 compare and swap,解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数--内存位置(V).预期原值(A)和新值(B).如果内存位置的值与预期原值相匹配,那么 ...

最新文章

  1. go语言笔记——go是有虚拟机runtime的,不然谁来做GC呢,总不会让用户自己来new和delete进行内存管理吧,还有反射!Go 的 runtime 嵌入到了每一个可执行文件当中...
  2. Visual Studio 2012中的为创建类时的添加注释模板
  3. 公有云 --- 华为云的基本运用
  4. C# Httpclient编程
  5. Shell——read读取控制台输入和函数
  6. android handler内存,Android handler之内存泄露原因揭示
  7. Python 远程开关机
  8. 「快学springboot」SpringBoot整合freeMark模板引擎
  9. centos rpm安装mysql5.6_CentOS 7下使用RPM安装MySQL 5.6
  10. JS实现键盘事件上下翻页
  11. Atitit 自然语言与人工语言的语法构建ast的异同点 目录 1. 语言节点gaishu。。 2 1.1. 节点、函数数量大约200个 2 1.2. 关键词节点 是 有 的 3 1.3. 标识符
  12. Kruskal理解+代码解析
  13. 备忘录怎么完整发给别人
  14. 图论 —— 图的遍历 —— 哈密顿问题
  15. 手眼标定AX=XB原理
  16. 面试感悟----一名3年工作经验的程序员应该具备的技能(转载自@五月的仓颉)...
  17. AS调用百度地图定位
  18. 1024程序员节,博客专家“定制勋章”名单出炉
  19. Linux下NFS配置与tftp配置
  20. java毕业设计——基于JSP+sqlserver的网上购物系统设计与实现(毕业论文+程序源码)——网上购物系统

热门文章

  1. java多对多的存储_Swift CoreData,通过多对多关系保存数据
  2. 大学计算机专业挂科人多吗,这几个专业真的是太难了,挂科率年年都是新高,很多人都后悔了...
  3. 基于物联网的新型智能家居控制系统设计
  4. centos7进入单用户模式
  5. vSphere 5.5:使用 RVC VSAN 监控工具
  6. web dialog 内嵌 图片_Unity游戏如何在iOS上调用Facebook原生对话框分享图片
  7. centos sftp客户端 c 源码_Redis第3课:如何使用 Redis客户端
  8. java记事本获取当前时间_calendar 用Java写的日历,有查询时间日期,还有记事本以及到点提醒功能。 Develop 238万源代码下载- www.pudn.com...
  9. oracle日期大于3个月,用三个月时间做oracle实验,养成实验习惯
  10. 手机上网有几种方式?