zoukankan      html  css  js  c++  java
  • CAS

    CompareAndSet===>CAS 比较并交换

    CAS是什么:
    全称为CompareAndSet,是一条CPU并发原语。它的功能是判断内存中某个位置的值是否是期望值,是的话更改为新的值,这个过程是原子性的。
    CAS并发原语体现在JAVA语言中就是sun.misc.unsafe类中的各个方法中。调用Unsafe类中的cas方法,JVM会帮我们实现出CAS汇编指令。
    这是一种完全依赖于硬件的功能,通过它实现了原子操作,再次强调,由于CAS是一种系统原语,原语属于操作系统用于范畴,是由若干条指令组成,
    用于完成某个功能,且原语执行必须是连续的,在执行过程中不允许中断,CAS是一条CPU的原子指令,不会造成所谓的数据不一致。
    比较当前工作内存中的值和主内存中的值,如果相同则执行规定操作,否则继续比较直到主内存和工作内存中的值一直为止。
    CAS应用:有3个操作数,内存值V,就得预期值A,要修改的新值B,当预期值A和内存值V相同时,将内存值V改为B,,否则什么都不做。


    CAS底层原理:自旋锁&unsafe


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

    3、变量value是用volatile修饰的,保证了多线程之间的内存可见性

    CAS的缺点:
    1、循环时间长,CPU开销大
    2、只能保证一个共享变量的原子操作
    3、ABA问题

  • 相关阅读:
    vue打包传递参数配置域名
    相同域名nginx下部署两个vue项目
    vue项目改造服务端渲染
    vue项目使用less全局变量
    postMessage跨域实现localstorage跨域共享
    node_webkit打包成桌面应用程序
    vue项目本地服务器设置既能localhost访问又能手机ip访问
    GATT scan的流程
    Windows下面的常用的快捷键
    把驱动编译进内核和编译成模块
  • 原文地址:https://www.cnblogs.com/wangyingshuo/p/14116723.html
Copyright © 2011-2022 走看看