Jave 面试 CAS底层与原理

好兄弟们,不会真有人看不懂CAS吧?反正我是没看懂…

一. CAS是什么?

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 1. CAS是什么? => compareAndSet 比较并交换
 */
public class CASTest {

    public static void main(String[] args) {

        AtomicInteger atomicInteger=new AtomicInteger(5);

        System.out.println(atomicInteger.compareAndSet(5,2019)+"\t "+"currentData: "+atomicInteger.get());

        System.out.println(atomicInteger.compareAndSet(5,2020)+"\t "+"currentData: "+atomicInteger.get());
    }
}

周阳老师的图就是画的骚~

在这里插入图片描述
怎么个意思呢

  • 一开始,我给主物理内存设置值为5
  • 第一个线程来了,要跟内存比较并交换,线程的期望值是 5 ,而刚好内存值就是5, 然后就交换了值,也就是把主物理内存的值5改为了2019,然后返回了个true代表取到的值与期望值是一样的
  • 然后通知其他线程可见了,第二个线程来了,发现主物理内存是2019,跟自己的期望值5不一样啊,然后就返回了个false,主物理内存并没有改变~.

二. CAS底层原理

首先来看看atomicInteger.getAndIncrement()为什么不加synchronized也能在多线程下保持线程安全
在这里插入图片描述
点开后,我们发现有个unsafe类,unsafe是CAS的核心类

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

注意Unsafe类中的所有方法都是native修饰的,也就是说Unsafe类中的方法都直接调用操作系统底层资源执行相应任务

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

  • **3. 变量value用volatile修饰, 保证了多线程之间的内存可见性。
    **

2.1 CAS底层

CAS的全称为Compare-And-Swap,它是一-条CPU并发原语。

它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的。

CAS并发原语体现在JAVA语言中就是sun.misc.Unsafe类中的各个方法。调用UnSafe类中的CAS方法,JVM会帮我们实现出CAS汇编指令。这是一种完全依赖于硬件的功能,通过它实现了原子操作。再次强调,由于CAS是一种系统原语,原语属于操作系统用语范畴,是由若干条指令组成的,用于完成某个功能的一一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条CPU的原子指令,不会 造成所谓的数据不一致问题。

在这里插入图片描述
首先, var1代表当前对象,var2代表对象的偏移地址,var4就是那个+1的值,然后getIntVolatile()这个方法去获取当前对象的这个值是多少,给他保存到var5,然后,过了一会,compareAndSwapInt()这个方法去再比较当前对象的值还是不是var5,是的话就给这个值+1,返回true,while里面就是false就退出循环,最后返回出+1后的值. 如果当前对象不是之前的var5了,返回一个false,while循环里面就是true,继续循环,拿到下一个值去比较,直到比较成功~

唉…还没写完呢,明天就写完了!

发布了84 篇原创文章 · 获赞 72 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/kingtok/article/details/105058823