★ 1、CAS 是什么

CAS 是比较并交换,是实现并发算法时常用到的一种技术当内存的值和期望的值相等时,进行更新,否则 什么都不做重来

CAS 的底层实现:是靠硬件实现的,靠硬件的原子性实现CAS是一条CPU的原子指令cmpxchg指令),不会造成所谓的数据不一致问题

重来==>自旋

CAS 类似乐观锁,乐观的认为别人没有修改,当值还是预期值,就进行修改,否则可能什么都不做,或者重来。

★ 2、CAS 应用举例

  • 原子操作类,比如整型的原子操作类的compareAndSet方法
  • 我的博客项目中,在更新文章浏览次数时,当前内存的文章浏览次数 和 期望中的数据库的文章浏览次数 进行比较,如果是相同的,则加1,否则 什么都不做

3、原子类

原子类==> 底层思想/工作原理 CAS ==> Unsafe 类的CPU 原语级别的汇编操作

  • CAS 是靠硬件实现的,靠硬件的原子性实现CAS是一条CPU的原子指令cmpxchg指令),不会造成所谓的数据不一致问题

    Unsafe提供的CAS方法(如compareAndSwapXXX)底层实现即为CPU指令cmpxchg。

■ AtomicInteger 类主要利用 CAS + volatile 和 native 方法来保证原子操作,从而避免 synchronized 的高开销,执行效率大为提升。

new AtomicInteger().compareAndSet(0, 1);

// 底层实现
public final int getAndAdd(int delta) {
return unsafe.getAndAddInt(this, valueOffset, delta);
}
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
} new AtomicInteger().getAndAdd(1);//获取到当前值并加1
// 底层实现
public final int getAndAdd(int delta) {
return unsafe.getAndAddInt(this, valueOffset, delta);
}
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
var5 = this.getIntVolatile(var1, var2);
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
return var5;
}

工作中,不建议使用Unsafe 类,类名就提示你了"不安全"!

4、Unsafe 类

  • 是CAS的核心类
  • 可以像C的指针一样直接操作内存
  • Unsafe类中的所有方法都是native修饰的Unsafe类中的方法都可以直接调用操作系统底层资源去执行相应任务
//原子类
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1);
} private volatile int value;

变量valueOffset,表示该变量值在内存中的偏移地址,因为 Unsafe就是根据内存偏移地址获取数据的。

变量value用volatile修饰,保证了多线程之间的内存可见性。每次获取的值都是最新的。

5、CAS 带来的问题

  • 循环时间长,可能死循环,开销很大
  • ABA 问题
    • 解决ABA 问题: 带版本号的原子引用 AtomicStampedReference

如果本文对你有帮助的话记得给一乐点个赞哦,感谢!

CAS核心思想、底层实现的更多相关文章

  1. 大数据理论篇 - 通俗易懂,揭秘谷歌《The Dataflow Model》的核心思想(一)

    目录 前言 目标 核心的设计原则 通用的数据处理流程 切合实际的解决方案 总结 延伸阅读 最后 作者:justmine 头条号:大数据达摩院 创作不易,未经授权,禁止转载,否则保留追究法律责任的权利. ...

  2. 浅谈Vue.js2.0核心思想

    Vue.js是一个提供MVVM数据双向绑定的库,专注于UI层面,核心思想是:数据驱动.组件系统. 数据驱动: Vue.js数据观测原理在技术实现上,利用的是ES5Object.defineProper ...

  3. Vue学习日记(二)——Vue核心思想

    前言 Vue.js是一个提供MVVM数据双向绑定的库,其核心思想无非就是: 数据驱动 组件系统 数据驱动 Vue.js 的核心是一个响应的数据绑定系统,它让数据与DOM保持同步非常简单.在使用 jQu ...

  4. EGADS介绍(二)--时序模型和异常检测模型算法的核心思想

    EDADS系统包含了众多的时序模型和异常检测模型,这些模型的处理会输入很多参数,若仅使用默认的参数,那么时序模型预测的准确率将无法提高,异常检测模型的误报率也无法降低,甚至针对某些时间序列这些模型将无 ...

  5. 《深入理解Spark:核心思想与源码分析》——SparkContext的初始化(叔篇)——TaskScheduler的启动

    <深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...

  6. 《深入理解Spark:核心思想与源码分析》(前言及第1章)

    自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...

  7. 《深入理解Spark:核心思想与源码分析》(第2章)

    <深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...

  8. 《深入理解Spark:核心思想与源码分析》一书正式出版上市

    自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...

  9. 《深入理解Spark:核心思想与源码分析》正式出版上市

    自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...

随机推荐

  1. day02 IO

    JAVA IO java io可以让我们用标准的读写操作来完成对不同设备的读写数据工作. java将IO按照方向划分为输入与输出,参照点是我们写的程序. 输入:用来读取数据的,是从外界到程序的方向,用 ...

  2. 温控器/胎压检测/电表/热泵显示控制器等,低功耗高抗干扰断/段码(字段式)LCD液晶显示驱动IC-VK2C22A/B,替代市面16C22,44*4/40*4点显示

    产品品牌:永嘉微电/VINKA 产品型号:VK2C22A/B 封装形式:LQFP52/48 产品年份:新年份 概述: VK2C22是一个点阵式存储映射的LCD驱动器,可支持最大176点(44SEGx4 ...

  3. Nginx第三方模块Ngx-dyups安装过程

    Ngx-dyups是什么,能干什么 它是一个Nginx第三方动态Upstream配置模块,可以实现在不重启Nginx情况下动态更新反向代理Upstream表.该模块由淘宝开发团队维护,淘宝自家的Ten ...

  4. 如何用WebGPU流畅渲染百万级2D物体?

    大家好~本文使用WebGPU和光线追踪算法,从0开始实现和逐步优化Demo,展示了从渲染500个2D物体都吃力到流畅渲染4百万个2D物体的优化过程和思路 目录 需求 成果 1.选择渲染的算法 2.实现 ...

  5. YII学习总结4(cookie操作)

    cookie操作 <?php namespace app\controllers; use yii\web\Controller; use yii\web\Cookie; class Hello ...

  6. YII总结学习7(在一个视图中显示另外一个视图)

    controller\hello <?php namespace app\controllers; use yii\web\Controller; class helloController e ...

  7. 轻盈潇洒卓然不群,敏捷编辑器Sublime text 4中文配置Python3开发运行代码环境(Win11+M1 mac)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_210 20世纪初,几乎所有的飞机都是并列双翼结构,此时,美国著名飞行大亨霍华德·休斯认为自己的飞机不够快,助手委婉地提醒他,如果速 ...

  8. Odoo14 groups && rule

    # Odoo14 groups && rule # admin账户以及权限的来源: # admin创建代码在:odoo/odoo/addons/base/data/res_users_ ...

  9. .NET WebAPI 采用 IDistributedCache 实现分布式缓存过滤器 Redis 模式

    分布式缓存是由多个应用服务器共享的缓存,通常作为访问它的应用服务器的外部服务进行维护. 分布式缓存可以提高 ASP.NET Core 应用的性能和可伸缩性,尤其是当应用由云服务或服务器场托管时. 与其 ...

  10. 零基础学Java(14)对象构造

    对象构造 之前学习了编写简单的构造器,可以定义对象的初始状态.但是,由于对象构造非常重要,所以Java提供了多种编写构造器的机制. 重载 有些类有多个构造器.例如,可以如下构造一个空的StringBu ...