CAS 分析

CAS是什么java

  (1) CAS(Compare and Swap) 比较并交换, 比较并交换是在多线程并发时用到的一种技术安全

  (2) CAS是原子操做, 保证并发安全性, 而不是保证并发同步.多线程

  (3) CAS是一个CPU指令并发

  (4) CAS是一种非阻塞的轻量级乐观锁jvm

什么是乐观锁和悲观锁性能

  乐观锁, 严格来说并非锁, 他是经过原子性来保证数据的同步, 乐观的认为在数据操做期间没有其余线程影响. 而悲观锁例如: synchronize  认为在数据操做期间必定会有其余线程影响, 因此会经过并发同步的方式来保证数据的正确.  因此CAS不会保证线程同步, 乐观地认为在数据更新期间没有其余线程影响.this

CAS原理atom

  CAS, 比较并交换, 是将内存值更新为须要的值, 可是有个条件, 就是内存值必须与指望值相同. 例如: 指望值 E, 工做内存值 M , 更新值 U, 只有 当 E == M 时, 将M 更新为U. spa

CAS应用操作系统

  因为CAS是CPU指令,咱们只能经过JNI与操做系统交互,关于CAS的方法都在sun.misc包下Unsafe的类里 java.util.concurrent.atomic包下的原子类等经过CAS来实现原子操做。

CAS指令

  原子类例如AtomicInteger,  其中的getAndIncrement方法就用了CAS. 

 

public final int getAndIncrement() {
        //主要看这个getAndAddInt方法
        return unsafe.getAndAddInt(this, valueOffset, 1);
}

//var1 是this指针
//var2 是地址偏移量
//var4 是自增的数值,是自增1仍是自增N
public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
        //获取主内存值,这是内存值已是旧的,假设咱们称做指望值E
            var5 = this.getIntVolatile(var1, var2);
            //var5是指望值E,var5 + var4是要更新的值
            //这个操做就是调用CAS的JNI,每一个线程将本身内存里的内存值M和指望值E做比较,
            //若是相同将内存值M更新为var5 + var4,并同步到主内存, 不然作自旋操
    } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
    return var5;
 }            

 

  流程: 

  1. 假设有两个线程: A, B

  2. jvm 中主内存为1 , A, B 线程的工做内存为1 (工做内存会拷贝一份主内存的值)

  3. 当前指望值E为1 , A, B 两个线程作+1操做

  4. 执行到getAndAddInt方法,  var5 = 1 , var4 = 1,

    (1) A线程将var5 与工做内存值M比较,  比较var5 是否等于1

    (2) 若是相等, 则将工做内存值更新为 var5+var4 , 并更新到主内存, 此时this指针的value = 2

    (3) 若是不相等, 说明B线程先A线程进行了更新操做, 这时主内存值 = 2,  A线程未更新成功继续循环, var5 更新为新主内存值 = 2,  由于this指针的value用volatile 修饰, 因此更新为2,  这时继续将 var5 与工做内存值M比较, 比较var5 是否等于 2 , 相等则将工做内存值更新为var5 + var4,  并更新到主内存, 此时this指针的value = 3; 主内存值为3; 

    (4) 若是一直不相等, 重复第三步直到相等退出更新. 

CAS 优缺点

  • 优势

     非阻塞的轻量级乐观锁, 经过CPU指令实现, 在资源竞争不激烈的状况下性能高, 相比synchronize重量级悲观锁, synchronize有复杂的加锁, 解锁和唤醒线程操做. 

  • 缺点

     (1) ABA 问题, 线程1, 2.  线程1 将A修改成B后又修改成A, 此时线程2觉得A没有改变过. 而 J巴德原子类AtomicStampedReference, 经过控制变量值的版原本保证CAS的正确性.

     (2) 自旋时间过长, 消耗CPU资源, 若是资源竞争激烈, 啧多线程自旋时间长消耗资源.

相关文章
相关标签/搜索