美文网首页
java8_原子更新

java8_原子更新

作者: 梓青 | 来源:发表于2016-11-11 19:31 被阅读342次

    标签: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;
    }

    相关文章

      网友评论

          本文标题:java8_原子更新

          本文链接:https://www.haomeiwen.com/subject/hkbfpttx.html