• CAS


    CAS 比较并交换 CompareAndSwap

    比较当前工作内存中的值和主内存中值,如果相同则执行规定操作,否则积蓄比较直到主内存和工作内存中的值一致为止。如果CCAS失败,会一直进行尝试。如果CAS长时间一致不成功,可能会给CPU带来很大的开销。

    CAS操作包含三个操作数:内存位置(V)、预期原值(A)、新值(B),如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新增。

    CAS的目的:利用CPU的CAS指令,同时借助JNI来完成java的非阻塞算法。

    CAS存在的问题:虽然很高效的解决了原子操作,但是存在三大问题;

    (1)     ABA问题;

    (2)     循环时间长开销大

    (3)     只能保证一个共享变量的原子操作

    Unsafe是CAS的核心类,由于java方法无法直接访问底层系统,需要通过本地(native)方法来访问,Unsafe相当于一个后门,基于该类可以直接操作特定的内存的数据。

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

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

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

    解决ABA问题  AtomicReference原子引用

  • 相关阅读:
    [ APIO 2015 ] 雅加达的摩天楼
    「POI2011 R1」Conspiracy
    「COCI2016/2017 Contest #2」Bruza
    「THUWC 2017」随机二分图
    「HAOI2015」按位或
    Topcoder Srm 726 Div1 Hard
    「LOJ6482」LJJ爱数数
    「2017 山东一轮集训 Day4」基因
    「Codechef April Lunchtime 2015」Palindromeness
    「UOJ207」共价大爷游长沙
  • 原文地址:https://www.cnblogs.com/yutting/p/11492842.html
Copyright © 2020-2023  润新知