CAS核心思想、底层实现

简介: CAS核心思想、底层实现

★ 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



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

目录
相关文章
|
存储 Java
HashMap扩容机制详解
HashMap扩容机制详解
|
存储 算法 NoSQL
还分不清 Cookie、Session、Token、JWT?看这一篇就够了
Cookie、Session、Token 和 JWT(JSON Web Token)都是用于在网络应用中进行身份验证和状态管理的机制。虽然它们有一些相似之处,但在实际应用中有着不同的作用和特点,接下来就让我们一起看看吧,本文转载至http://juejin.im/post/5e055d9ef265da33997a42cc
48315 13
|
消息中间件 SQL 存储
超详细的RabbitMQ入门,看这篇就够了!
RabbitMQ入门,看这篇就够了
218725 69
|
Linux Python
centos使用Linux命令行测试网速/带宽
安装speedtest-cli speedtest-cli是一个用Python编写的轻量级Linux命令行工具,在Python2.4至3.4版本下均可运行。
4487 0
|
存储 数据可视化 数据挖掘
【docker】使用docker安装部署elasticsearch+Kibana(上)
【docker】使用docker安装部署elasticsearch+Kibana
994 0
|
11月前
|
机器学习/深度学习 算法 索引
单目标问题的烟花优化算法求解matlab仿真,对比PSO和GA
本项目使用FW烟花优化算法求解单目标问题,并在MATLAB2022A中实现仿真,对比PSO和GA的性能。核心代码展示了适应度计算、火花生成及位置约束等关键步骤。最终通过收敛曲线对比三种算法的优化效果。烟花优化算法模拟烟花爆炸过程,探索搜索空间,寻找全局最优解,适用于复杂非线性问题。PSO和GA则分别适合快速收敛和大解空间的问题。参数调整和算法特性分析显示了各自的优势与局限。
519 11
|
SQL 存储 关系型数据库
SQL `CREATE DATABASE` 语法
【11月更文挑战第10天】
359 3
|
运维 芯片
主板电源符号揭秘:深入了解VDD、VDDQ、5VSB及其他
本文介绍了计算机主板电源设计中的关键符号,包括VDD(通用数字电路电源)、VDDQ(高稳定度滤波电源)、5VSB和3VSB(待机电源)、VCC3(+3V主要电源)、VDIMM(内存专用电源)、SB(待机电池电源)以及VCORE(CPU核心电压)。这些电源符号各自对应特定的供电区域和功能,确保主板组件的稳定运行。理解这些电源符号对于主板电源管理、故障排查和系统优化具有重要意义。
|
SQL 设计模式 存储
【MySQL】一文搞懂MySQL语法(进阶)
本文讲述了SQL语法一些进阶内容,全文3.4w字,都是一句一句话指导,相信用心看,肯定会有收获的,需要哪一部分的内容,点击目录即可跳转
663 0
【MySQL】一文搞懂MySQL语法(进阶)