Cas

一、什么是CAS

CAS,compare and swap的缩写,中文翻译成比较并交换。

  • 一种算法,一种实现线程安全的算法

  • 运用场合,并发

  • 一种CPU指令

  • 认为V的值应该是A,如果是的话那我就把它改成B,如果不是A(说明有人修改过),那就不修改了,避免多人同时修改导致出错

  • CAS的三个操作数

    • 内存值V
    • 预期值A
    • 要修改的值B

当前仅当内存值V等于预期值A时,于将内存值V修改为B,否则什么都不做。最后返回现在的V值

  • CPU的特殊指令

    • 由CPU保证了原子性操作

    • 一个指令就包含很多的一系列操作


二、案例演示

  • CAS的等价语义
/******@author 阿昌@create 2021-06-13 14:46********      模拟CAS操作,等价代码*/
public class SimulatedCAS {private int value;/*** 模拟CAS操作* @param expectedValue 期盼值* @param newValue 修改值* @return 旧值*/public synchronized int compareAndSwap(int expectedValue, int newValue) {int oldValue = value;if (oldValue == expectedValue) {value = newValue;}return oldValue;}
}
  • 案例演示两个线程竞争,其中一个落败
/******@author 阿昌@create 2021-06-13 14:46********      两个线程竞争,其中一个落败*/
public class TwoThreadCompetition implements Runnable{private int value;/*** 模拟CAS操作* @param expectedValue 期盼值* @param newValue 修改值* @return 旧值*/public synchronized int compareAndSwap(int expectedValue, int newValue) {int oldValue = value;if (oldValue == expectedValue) {value = newValue;}return oldValue;}//主函数public static void main(String[] args) throws InterruptedException {TwoThreadCompetition r = new TwoThreadCompetition();r.value=0;//默认值Thread thread1 = new Thread(r,"线程1");Thread thread2 = new Thread(r,"线程2");thread1.start();thread2.start();thread1.join();thread2.join();System.out.println(r.value);}@Overridepublic void run() {compareAndSwap(0,1);}
}

三、应用场景

  • 乐观锁

数据库version字段…

  • 并发容器

如ConcurrentHashMap类中的putVal()方法

  • 原子类

那么Java中如何利用CAS实现原子操作????接下来,用AtomicInteger作为例子分析

  1. AtomicInteger加载Unsafe工具,用来直接操作内存数据

  2. 用Unsafe工具来实现底层操作

  3. 用volatile修饰value字段,保证可见性

  1. getAndIncrement()方法为例子

    这里出现了我们上面的模拟CAS语义的compareAndSwapInt()方法↓↓↓

    var5:返回的旧值

    do-while是一个自旋,如果这次更新失败,他就会进行重试

    发现,compareAndSwapInt()方法是被native修饰的

上面用到了很多Unsafe类,那么Unsafe类是什么????


四、Unsafe类

compareAndSwapInt()为例子,发现他是native修饰的方法,底层有C++代码实现

通过之前的方法,获取带了这个底层C++代码的实现,如下:

  • 总结上面的:那么Java中如何利用CAS实现原子操作???? 问题

五、CAS的缺点

1、ABA问题

什么是ABA问题呢?

就是说CAS操作就是比较当前值和期盼值是否相等,如果相等就修改为修改值;

比如当前值为5,期盼值为5,修改值为7;

那么如果线程A在判断比较当前值5和期盼值5相等后,在还没进行修改修改值时,期间有两个线程进来为线程B、线程C。线程B把当前值改为10,然后线程C把当前值改为5,那么就出现了ABA问题!!!

此时线程A还依然的任务这个当前值是没有被其他线程修改过的,但是实际上,当前值已经被修改了两次,但是其最终被修改的当前值结果等于线程A的期盼值的结果,也就是5=5;

那么如何解决ABA问题呢?

可以采用数据库的乐观锁方式,采用version版本号,每次修改就给version版本号+1


2、自旋时间过长

do-while的自旋循环,如果再次期间线程竞争激烈或锁一直拿不到,他就会一直自旋,消耗CPU性能


Day297.CAS -Juc相关推荐

  1. Java怎么学,Java学习路线,程序员由浅到深学习之路

    目录 友情提醒 第一章.Java基础 1.1)第一部分:Java 入门 1.2)第二部分:Java数组 1.3)第三部分:Java面向对象 1.4)第四部分:常用工具类 1.5)第五部分:集合体系 1 ...

  2. 浅谈Java锁,与JUC的常用类,集合安全类,常用辅助类,读写锁,阻塞队列,线程池,ForkJoin,volatile,单例模式不安全,CAS,各种锁

    浅谈JUC的常用类 JUC就是java.util.concurrent-包下的类 回顾多线程 Java默认有几个线程? 2 个 mian.GC Java 真的可以开启线程吗? 开不了,点击源码得知:本 ...

  3. 多线程与高并发(三):JUC包下新的同步机制:CAS,AtomicInteger,AtomicLong,ReentrantLock,CountDownLatch,ReadWriteLock等

    CAS CAS 是一种乐观锁,syncronized 是一种悲观锁 AtomicInteger AtomicInteger count = new AtomicInteger(0); /*synchr ...

  4. 【重难点】【JUC 04】synchronized 原理、ReentrantLock 原理、synchronized 和 Lock 的对比、CAS 无锁原理

    [重难点][JUC 04]synchronized 原理.ReentrantLock 原理.synchronized 和 Lock 的对比.CAS 无锁原理 文章目录 [重难点][JUC 04]syn ...

  5. 狂神JUC——CAS

    JUC 1 狂神JUC--传统的Synchronized锁 2 狂神JUC--Lock锁 3 狂神JUC--Lock版生产者和消费者 4 狂神JUC--Synchronized版的生产者和消费者问题 ...

  6. juc是个什么鬼(一) Java并发包详情,CAS分析,解决ABA问题

    JUC就是java.util.concurrent包,俗称java并发包 通过看JDK的API,我们发现JUC下有俩子包,分别是atomic和locks包,这篇文章重点就是看这两个包下的内容 Atom ...

  7. JUC多线程:Atomic原子类与CAS原理

    一.Atomic 原子类的原理: Atomic 原子操作类是基于无锁 CAS + volatile 实现的,并且类中的所有方法都使用 final 修饰,进一步保证线程安全.而 CAS 算法的具体实现方 ...

  8. Java面试题目,CAS都不了解,你还怎么看J-U-C不可思议!

    欢迎关注专栏:Java架构技术进阶.里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦. 前言 说到CAS(CompareAndSwap),不得不先说一说悲观锁和乐观锁,因为CAS ...

  9. Java --- JUC之CAS

    目录 一.CAS 二.CAS原理 三.CAS简单使用 四.CAS的实现 4.1.硬件级别保证 4.2.源码分析 五.Unsafe类 六.CAS的AtomicReference的使用 七.使用CAS实现 ...

最新文章

  1. 网站收录工具(php导航自动收录源码)_网站如何快速收录,网站不收录怎么办?...
  2. TEASER-plusplus 编译测试
  3. SQLite的事务处理方式
  4. Oracle常用数据库系统表单以及SQL的整理
  5. Tomcat集群快速入门2
  6. PL/SQL -- DML 触发器
  7. 2021年文山州一中高考成绩查询,云南文山第一中学2021年录取分数线
  8. bzoj 1045: [HAOI2008]糖果传递
  9. (译)iOS Code Signing: 解惑
  10. 仿美团酒店预订的html模板,jQuery手机端仿美团酒店预订日期选择插件
  11. 三读《UNIX编程艺术》——UNIX哲学
  12. 红米7pro支持html不,可以畅快的刷机了,红米Note 7 Pro等机型适配 TWRP
  13. 【MATLAB中UIGETFILE函数的用法】
  14. 阿里笔试 3.14 T1
  15. rain、rainy、raining的区别
  16. 国密算法 SM2 公钥加密 非对称加密 数字签名 密钥协商 python实现完整代码
  17. 无法打开包括文件: “ocl_macros.h”: No such file or directory
  18. 地面气象观测数据-A文件转excel方法
  19. ThinkPad 声卡出现未安装任何音频输出设备
  20. 【如何配置环境变量】

热门文章

  1. Bootstrap Affix和过渡效果插件的详细使用【前端Bootstrap框架】
  2. macOS Hight Sierra 系统更新提示没有链接互联网
  3. c++ memset 语言_c++ memset
  4. 07年美科技股涨幅排行榜 百度第一
  5. 窗口启用/禁用功能函数EnableWindow的使用
  6. 使用PaddleNLP打造精准文献检索系统,看万方系统升级放大招!
  7. Qt Quick系列(5)—键盘输入
  8. 密码学的发展(第三篇:计算机对称加密法)
  9. 电脑维护与优化:延长战友的寿命
  10. 金三银四,你真的懂软件测试吗?