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



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

时间: 2024-11-04 02:13:44

LongAdder和AtomicLong性能对比的相关文章

ARM演化变迁性能对比

ARM演化变迁: ARM经典:ARM7,ARM9,ARM11性能依次提升. Cortex: M系列:Cortex-M0,Cortex-M1,Cortex-M2,Cortex-M3,Cortex-M4应用于工控领域(没有操作系统)类比单片机性能比单片机强. R系列:Cortex-R4面向实时应用,可以运行操作系统. A系列:Cortex-A5,Cortex-A8,Cortex-A9主要面向多媒体应用,现代智能手机基本采用Cortex-A系列.M,R,A系列性能也是依此提升. 其性能对比:ARM7与

自己写的轻量级PHP框架trig与laravel,yii性能对比

看了下当前最热门的php开发框架,想对比一下自己写的框架与这些框架的性能对比. 看结果对比. laravel 5.1: yii2: trig: 自己写的框架速度是lavavel 5.1的8倍,是yii2的5.3倍.

Struts2、SpringMVC、Servlet(Jsp)性能对比 测试

Struts2.SpringMVC.Servlet(Jsp)性能对比 测试 . Servlet的性能应该是最好的,可以做为参考基准,其它测试都要向它看齐,参照它. 做为一个程序员,对于各个框架的性能要有一个基本的认知,便于选型时做出正确的决策. 在测试中发现了什么也不要大喊大叫,因为这些都是Java程序员的基础知识. 人人都要了解. ----------------------------------------------------------------------------------

开发语言性能对比,C++、Java、Python、LUA、TCC

一直想做开发语言性能对比,刚好有时间都做了给大家参考一下, 编译类:C++和Java表现还不错 脚本类:TCC脚本动态运行C语言,性能比其他脚本快好多... 想玩TCC的同学下载测试包,TCC目录下修改script.c,运行TccTest1.exe即可看到修改效果,无需编译!!! 链接:http://pan.baidu.com/s/1kUVGGwJ 密码:mgpx C++(VS2017) java8.2 Python2.7-3.5.2 aardio(LUA) TCC

HW3000、SI4432、A7139及目前市面主流的Sub-1G芯片性能对比

HW3000.SI4432.A7139.SX1278.CC1120及目前市面主流的Sub-1G芯片性能对比

使用httpclient实现http链接池与使用HttpURLConnection发送http请求的方法与性能对比

使用httpclient实现http链接池与使用HttpURLConnection发送http请求的方法与性能对比 在项目中需要使用http调用接口,实现了两套发送http请求的方法,一个是使用apache的httpclient提供的http链接池来发送http请求,另一个是使用java原生的HttpURLConnection来发送http请求,并对两者性能进行了对比. 使用httpclient中的链接池发送http请求 使用最新的4.5.2版httpclient进行实现.在maven中引入 <

C正则库做DNS域名验证时的性能对比

C正则库做DNS域名验证时的性能对比 本文对C的正则库regex和pcre在做域名验证的场景下做评测. 验证DNS域名的正则表达式为: "^[0-9a-zA-Z_-]+(\\.[0-9a-zA-Z_-]+)*(\\.[a-zA-Z]{2,}\\.)$" 对于正常DNS请求日志中的6177578条日志做正则验证处理. 1,pcre 评测所用的pcre的版本号是:7.8.3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2

前端框架性能对比

运行性能对比: JSP+Servlet > Struts1 > SpringMvc > Struts2+freemarker >> Struts2+OGNL+值栈 但是开发效率上正好相反,要特别注意,SpringMvc和Struts2不相上下

HTTPS,SPDY,HTTP/2性能对比

作者:zhanhailiang 日期:2015-01-24 原文:A Simple Performance Comparison of HTTPS, SPDY and HTTP/2 首先,恭喜Firefox 35成为第一个默认支持HTTP/2协议的浏览器.不过由于HTTP/2协议并未完全确定,所以目前Firefox实际支持的是HTTP/2 Draft 14版本(当然最终的协议确认不会有大的改动).由于Google已经在服务器端同时支持HTTP/2 Draft 14版本和SPDY协议,所以我们可以