码迷,mamicode.com
首页 > 其他好文 > 详细

LongAdder和AtomicLong性能对比

时间:2019-03-17 01:05:49      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:pac   lis   tar   1.5   封装   nta   string   sum   end   

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秒破亿次累加。翻倍的性能提升。



LongAdder和AtomicLong性能对比

标签:pac   lis   tar   1.5   封装   nta   string   sum   end   

原文地址:https://www.cnblogs.com/itbac/p/10545064.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!