《学习之笔记》CAS

CAS

在上一章笔记中说到了CAS,大家还有没有印象---------谁的原理是CAS?

当时讲的volatile---->不保证原子性—>怎么解决---->除了synchronized之外---->想起来了---->AtomicInteger(原子类型的数据类型)----->它原理是什么?------>CAS------->那开始表演吧

什么是CAS

------->比较交换(Compare And Set)

  1. 线程会拷贝主内存的变量a=1到自己的工作内存里,同时保存为期望值=1
  2. 线程在自己的工作内存里操作a,改成a=2,同时修改值a=2
  3. 修改完,这时候需要写入主内存,这时候在获取主内存变量a---------->作比较此时主内存a是否等于之前的期望值,
    不等于:说明在你操作时被别人修改了,重来。
    等于:说明可以,写入主内存。
    (期望值,内存值,修改值)

CAS底层原理

  1. 自旋锁
  2. Unsafe类保证原子性

啥子Unsafe?

jdk里出娘胎就携带了一个 Unsafe.class
是CAS的核心类,由于Java方法无法直接访问底层系统,需要通过本地(native)方法来访问,Unsafe相当于一个后门,基于该类可以直接操作特定内存的数据。Unsafe类存在于sun.misc包中,其内部方法操作可以像C的指针一样直接操作内存,因为Java中CAS操作的执行依赖于Unsafe类的方法。
注意:Unsafe类中的所有方法都是native修饰的,也就是说Unsafe类中的方法都直接调用操作系统底层资源执行相关任务

CAS缺点有啥?

  1. 如果CAS失败,会一直进行尝试,如果CAS长时间一直不成功,可能会给CPU带来很大的开销。
  2. 只能保证一个共享变量的原子操作
  3. 重要:ABA问题

NBA?不 !是ABA

狸猫换太子------>就是把变量从A改成了B ,然后又改成了A,这时候你来了你看还是A,哦!没有人改过,其实不然---->被人改动过了。

既然有这个问题,怎么解决?

我们先来看一下 -->原子引用

之前我们用的是AtomicInteger整数类型,如果我们有别的类型呢?User / Order 原子用户型呢?
当然我们也有对应原子封装类------->Class.AtomicReference

User user = new User("zhangsan",22);
AtomicReference<User>  atomicReference = new AtomicReference();
atomicReference.set(user);
System.out.println(atomicReference.compareAndSet(zhangsan,lisi)+"\t"+atomicReference.get().toString());

时间戳原子引用----------->解决ABA

新增一种机制, 那就是修改版本号(类似时间戳)
AtomicStampedReference
解释:给变量a加一个时间戳(版本控制),每次修改给版本加1,可以完美解决ABA,通过比较版本来判定是否被修改。

学到这里 又完事了---------------------------因为自己也是在边学边整理,希望能对大家有个启示作用,文章里有疑问,希望大神在留言区给揪出来 哈哈。
最后希望大家不要白嫖,给点个赞,鼓励一下

你可能感兴趣的:(java,CAS)