原子变量

1. 引言

通过CAS实现。想想这种场景:交通高度拥堵和低拥堵两者,信号灯和环岛的适用场景——前者是信号灯,后者是环岛——前者相当于锁,后者相当于基于CAS实现的原子变量——拥堵的高低与否,取决于线程的计算量大小,越大竞争越低。

  1. 原子变量将竞争范围缩小到单个变量上,是最细粒度的锁;
  2. 不用挂起、调度线程;
  3. 不易出现延迟、遇到竞争更容易恢复;
  4. compareAndSet()方法和volatile关键字的关联;
  5. 不宜做键值,因为未覆盖hashCode()、equals()方法,比如AtomicInteger中相同的值却指向了不同的对象。
2. 通过CAS来维持多个变量的不变性条件

比如不变形条件时维持上界与下界的大小关系:

public class CasNumberRange {

    private static class IntPair{
        final int low;
        final int up;
        public IntPair(int low, int up) {
            this.low = low;
            this.up = up;
        }
    }

    private final AtomicReference<IntPair> pair
            =new AtomicReference<>(new IntPair(0,0));

    public void setLow(int newLow){
        while(true){
            IntPair oldVla=pair.get();//获取旧值
            if(newLow>oldVla.up){
                throw new IllegalArgumentException();
            }
            IntPair newVal=new IntPair(newLow,oldVla.up);//需要写入的新值

            if(pair.compareAndSet(oldVla,newVal)){//如果现在的值与旧值相等,则更新为新值,原子CAS操作
                return;
            }
        }
    }
}

posted on 2018-04-21 14:03  coderDu  阅读(134)  评论(0编辑  收藏  举报