zoukankan      html  css  js  c++  java
  • 原子类-Adder累加器

    Adder累加器是在Jdk8引入的,AtomicLong的效率比较低,所以引入了LongAdder,为了提高并发情况下的效率。

    当竞争比较激烈的时候,LongAdder可以把不同的线程对应到不同Cell上进行修改,降低了冲突的概率,采用的是多段锁的理念,提高了并发的性能。

    下面我演示下LongAdder的性能。

    实例代码

      下面我们演示下高并发场景下LongAdder的性能大于AtomicLong,分别1万个线程,各个线程执行1万次。

      实例代码如下

      

    package com.yang.atomic;
    
    import java.awt.*;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.atomic.AtomicLong;
    import java.util.concurrent.atomic.LongAdder;
    
    /**
     * 本实例测试LongAdder 和AtomicLong的性能
     * 我们启用16个线程
     * 提交10000个任务
     * 每个任务累加10000次
     */
    public class LongAdderAndAtomicLongTest {
        private static AtomicLong atomicLong = new AtomicLong();
        private static LongAdder longAdder = new LongAdder();
    
        public static void main(String[] args) {
            //AtomicLong 线程池
            ExecutorService executorService = Executors.newFixedThreadPool(20);
            long beginAtomicLongMills = System.currentTimeMillis();
            AtomicLongRunnable atomicLongRunnable = new AtomicLongRunnable(atomicLong);
            for (int i = 0; i < 10000; i++) {
                executorService.submit(atomicLongRunnable);
            }
            executorService.shutdown();
            while (!executorService.isTerminated()) {
            }
            System.out.println("执行:" + atomicLong.get() + "AtomicLong多线程累加耗时:" + (System.currentTimeMillis() - beginAtomicLongMills));
    
    
            //LongAdder 线程池
            executorService = Executors.newFixedThreadPool(20);
            beginAtomicLongMills = System.currentTimeMillis();
            LongAdderRunnable longAdderRunnable = new LongAdderRunnable(longAdder);
            for (int i = 0; i < 10000; i++) {
                executorService.submit(longAdderRunnable);
            }
            executorService.shutdown();
            while (!executorService.isTerminated()) {
            }
            System.out.println("执行:" + atomicLong.get() + "LongAdder多线程累加耗时:" + (System.currentTimeMillis() - beginAtomicLongMills));
    
    
        }
    }
    
    class LongAdderRunnable implements Runnable {
        private LongAdder longAdder;
    
        public LongAdderRunnable(LongAdder longAdder) {
            this.longAdder = longAdder;
        }
    
        @Override
        public void run() {
            for (int i = 0; i < 10000; i++) {
                this.longAdder.increment();
            }
        }
    }
    
    class AtomicLongRunnable implements Runnable {
        private AtomicLong atomicLong;
    
        public AtomicLongRunnable(AtomicLong atomicLong) {
            this.atomicLong = atomicLong;
        }
    
        @Override
        public void run() {
            for (int i = 0; i < 10000; i++) {
                this.atomicLong.getAndIncrement();
            }
        }
    }
    

      从运行结果中我们发现LongAdder在多线程情况下比AtomicLong要好多的。见下图。

      

     

  • 相关阅读:
    周末现场支持
    变量&字符串
    dead loop、continue & break、while...else语句
    运算符、流程控制、while循环
    二进制、字符编码、浮点数、列表
    字符串操作
    元祖、hash了解、字典、集合
    大数据处理
    含有虚函数的派生类的sizeof
    eclipse UML插件 安装和使用
  • 原文地址:https://www.cnblogs.com/cnxieyang/p/12761158.html
Copyright © 2011-2022 走看看