• 原子类-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要好多的。见下图。

      

     

  • 相关阅读:
    Starting a Build
    getting the xml for running tfsreg.exe
    Monitoring and Analyzing Builds
    Getting Started with Silverlight
    Creating a New Build
    culture definition
    从数学到密码学(一)
    git如何建立分支实现新功能合并新功能到主分支
    git的patch解决二进制文件冲突生成某个文件的patch合并一个patch查看某个文件的历史比较两个文件
    blender 用户界面基本构成
  • 原文地址:https://www.cnblogs.com/cnxieyang/p/12761158.html
Copyright © 2020-2023  润新知