CAS算法以及CAS在JUC包原子类的应用

1、CAS的引入

  1. i++不是原子操作
  2. 可以在synchronized代码块中使用i++来保证原子性,但是synchronized的获取锁和释放锁带来的上下文切换开销太大
  3. 可以通过原子类(AutomicLong)来保证原子性,同时原子类中使用了CAS算法,保证了不阻塞情况下实现原子操作

2、CAS介绍

    CAS,compare and swap,也属于乐观锁的实现机制。 JAVA JDK中的unsafe类提供了一系列CAS操作。

3、JDK中的unsafe类

    unsafe类中的方法都是本地(native)方法,通过访问本地的c++库来实现
unsafe类中的重要方法
1、compareAndSwapLong(Object obj, long offset, long expect, long update)
//判断obj对象中偏移量为offset的变量的值是否等于expect。是的话把update赋值给这个变量,返回true;否则返回false
2、getAndSetLong(Object obj, long offset, long update){
    long l;
    do{
        l = getLongVolatile(obj, offset);//保证l的可见性
    }while(!compareAndSwapLong(obj, offset, l, update))
    return l;

}
//原子操作给变量赋值
3、getAndAddLong(Object obj, long offset, long addValue){
    long l;
    do{
        l = getLongVolatile(obj, offset);//保证l的可见性
    }while(!compareAndSwapLong(obj, offset, l, l+addValue))
    return l;

}
//原子操作i++

 4、JUC包中的原子类——AtomicLong

    JUC包中的原子类大量使用JDK提供的unsafe类,通过非阻塞的方式去实现原子操作 下面只以AtomicLong原子类为例介绍
AtomicLong的两个重要方法
incrementAndGet(){
    return unsafe.getAndAddLong(this, valueOffset, 1L) + 1L;
}
compareAndSet(long expect, long update ){
    return unsafe compareA dSwapLong this valueOffset , expect , update) ;
}
经验分享 程序员 微信小程序 职场和发展