java8_原子更新

标签:java

原子更新

回顾使用

Aotimic使用(自增,自减都为原子操作)

private static AtomicLong atomicLong=new AtomicLong(0);
private static Random random=new Random(47);
private static StampedLock stampedLock=new StampedLock();
/**
 * Aotimic使用(自增,自减都为原子操作)
 * 线程操作:将随机值赋值给atomicLong  
 * 多个线程操作时,每个线程都会以乐观操作的方式更新值,直到CAS操作成功
 */
private void AtomicDemo(){
    for(int i=0;i<10;i++){
        new Thread(()->{
            long oldValue;
            long randomLong;
            do{
                oldValue=atomicLong.get();
                randomLong=random.nextLong();
                //不断循环,直到CAS操作成功
            }while (!atomicLong.compareAndSet(oldValue,randomLong));
        }).start();
    }
}

LongAdder,LongAccumulator && DoubleAdder,DoubleAccumulator

大量操作,乐观锁需要太多次尝试,性能下降
LongAdder,LongAccumulator,内部维护多个累加数
不同线程更新不同的累加数,只有需要总值的时候才累加所有的累加数
DoubleAdder,DoubleAccumulator同上

private void longAdderTest(){
    LongAdder longAdder= new LongAdder();
    longAdder.increment();//+1
    longAdder.decrement();//-1
    longAdder.add(10L);//增加一个值(非原子操作)
    //内部多个变量a1,a2,a3......
    LongAccumulator longAccumulator=new LongAccumulator(
            //提供一个函数(非原子操作)
            (a,v)->{return a+v;},
            //初始值
            0
    );
    //每次调用,其中一个变量an->(an,10);
    longAccumulator.accumulate(10);
    //get方法会统计所有的变量,输出a1 op a2 op a3 op......
    longAccumulator.get();
}

StampedLock乐观读

/**
 * StampedLock乐观读
 */
private long getCurrentValue(){
    //获得一个印戳
    long stamp=stampedLock.tryOptimisticRead();
    long currentValue=atomicLong.get();
    //检验印戳是否可用
    if(!stampedLock.validate(stamp)){
        //不可用,某个线程正在写,使用悲观锁操作
        stamp=stampedLock.readLock();
        currentValue=atomicLong.get();
        stampedLock.unlockRead(stamp);//释放
    }
    return currentValue;
}
    原文作者:梓青
    原文地址: https://www.jianshu.com/p/ef2379ed5fff
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞