原子变量
1. 引言
通过CAS实现。想想这种场景:交通高度拥堵和低拥堵两者,信号灯和环岛的适用场景——前者是信号灯,后者是环岛——前者相当于锁,后者相当于基于CAS实现的原子变量——拥堵的高低与否,取决于线程的计算量大小,越大竞争越低。
- 原子变量将竞争范围缩小到单个变量上,是最细粒度的锁;
- 不用挂起、调度线程;
- 不易出现延迟、遇到竞争更容易恢复;
compareAndSet()
方法和volatile关键字的关联;- 不宜做键值,因为未覆盖
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;
}
}
}
}