• LongAdder和AtomicLong性能对比


    jdk1.8中新原子操作封装类LongAdder和jdk1.5的AtomicLong和synchronized的性能对比,直接上代码:

    package com.itbac.cas;
    
    import java.util.concurrent.atomic.AtomicLong;
    import java.util.concurrent.atomic.LongAdder;
    
    // 测试用例: 同时运行2秒,检查谁的次数最多
    public class LongAdderDemo {
        // synchronized 方式
        private long count = 0;
        // Atomic方式
        private AtomicLong acount = new AtomicLong(0L);
        // LongAdder 方式  (jdk1.8,新计数器)
        private LongAdder lacount = new LongAdder();
    
        // 运行时间,毫秒数
        private  int time=2000;
    
        // 同步代码块的方式
        public void testSync() throws InterruptedException {
            for (int i = 0; i < 3; i++) {
                new Thread(() -> {
                    long starttime = System.currentTimeMillis();
                    while (System.currentTimeMillis() - starttime < time) { // 运行两秒
                        synchronized (this) {
                            ++count;
                        }
                    }
                    long endtime = System.currentTimeMillis();
                    System.out.println("SyncThread spend:" + (endtime - starttime) + "ms" + " v:" + count);
                }).start();
            }
        }
    
    
    
        public void testAtomic() throws InterruptedException {
            for (int i = 0; i < 3; i++) {
                new Thread(() -> {
                    long starttime = System.currentTimeMillis();
                    while (System.currentTimeMillis() - starttime < time) { // 运行两秒
                        acount.incrementAndGet(); // acount++;
                    }
                    long endtime = System.currentTimeMillis();
                    System.out.println("AtomicThread spend:" + (endtime - starttime) + "ms" + " v:" + acount.incrementAndGet());
                }).start();
            }
        }
    
    
        public void testLongAdder() throws InterruptedException {
            for (int i = 0; i < 3; i++) {
                new Thread(() -> {
                    long starttime = System.currentTimeMillis();
                    while (System.currentTimeMillis() - starttime < time) { // 运行两秒
                        lacount.increment();
                    }
                    long endtime = System.currentTimeMillis();
                    System.out.println("LongAdderThread spend:" + (endtime - starttime) + "ms" + " v:" + lacount.sum());
                }).start();
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            LongAdderDemo demo = new LongAdderDemo();
            demo.testSync();
            demo.testAtomic();
            demo.testLongAdder();
        }
    }

    看看输出结果:

    SyncThread spend:2000ms v:25458554
    SyncThread spend:2000ms v:25458554
    SyncThread spend:2000ms v:25458554
    AtomicThread spend:2000ms v:78489760
    AtomicThread spend:2000ms v:78489759
    AtomicThread spend:2000ms v:78489758
    LongAdderThread spend:2000ms v:141154988
    LongAdderThread spend:2000ms v:141154988
    LongAdderThread spend:2000ms v:141352859

    jdk版本,作者及类名:

    * @since 1.5
    * @author Doug Lea 
    AtomicLong
    * @since 1.8
    * @author Doug Lea
    LongAdder

    让我们来膜拜一下大神!2秒破亿次累加。翻倍的性能提升。



  • 相关阅读:
    Java笔记(一)Eclipse 操作MySQL数据库的效率问题
    C# 笔记(六)关于switch 语句
    C# 笔记(五)关于static
    arcgis server 9.3初步
    C# 笔记(三)关于结构体变量
    OpenBSD随笔(一)
    Windows 脚本WSH
    Java笔记(二)Eclipse 连接SQlServer
    ArcGIS Server 9.3 JavaScript API实战(二)一个具体的小系统示例介绍
    C#笔记(二)类型转换
  • 原文地址:https://www.cnblogs.com/itbac/p/10545064.html
Copyright © 2020-2023  润新知