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
ConcurrentHashMap底层实现原理
ConcurrentHashMap底层实现原理
295 0
|
3月前
|
算法 Java
介绍一下CAS算法的实现原理
【10月更文挑战第20天】介绍一下CAS算法的实现原理
39 0
|
8月前
|
算法 安全 Java
Java多线程基础-12:详解CAS算法
CAS(Compare and Swap)算法是一种无锁同步原语,用于在多线程环境中更新内存位置的值。
75 0
|
Java 数据库连接 Spring
【Spring事务底层实现原理】
【Spring事务底层实现原理】
|
安全
多线程环境下,如何实现一个 Hash 结构?介绍一下 ConCurrentHashMap 的底层原理?
多线程环境下,如何实现一个 Hash 结构?介绍一下 ConCurrentHashMap 的底层原理?
84 0
多线程环境下,如何实现一个 Hash 结构?介绍一下 ConCurrentHashMap 的底层原理?
|
算法 安全 Java
CAS思想
CAS思想
118 0
|
存储 安全 关系型数据库
理论:第一章:HashMap底层实现原理,红黑树,B+树,B树的结构原理,volatile关键字,CAS(比较与交换)实现原理
理论:第一章:HashMap底层实现原理,红黑树,B+树,B树的结构原理,volatile关键字,CAS(比较与交换)实现原理
255 0
理论:第一章:HashMap底层实现原理,红黑树,B+树,B树的结构原理,volatile关键字,CAS(比较与交换)实现原理
|
存储 缓存 安全
ConcurrentHashMap底层实现原理
ConcurrentHashMap底层实现原理
ConcurrentHashMap底层实现原理
|
Java C语言
java并发编程中的CAS机制,你理解嘛?
学习Java并发编程,CAS机制都是一个不得不掌握的知识点。这篇文章主要是从出现的原因再到原理进行一个解析。希望对你有所帮助。
275 0