JDK 8新特性LongAdder和AtomicLong的性能测试对比

JDK 8 新特性LongAdder和AtomicLong的性能测试对比


测试代码

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.LongAdder;

/**
 * Created by changle on 16/9/8.
 */
public class Common {
    public static void main(String[] args){
        //testAtomicLongVSLongAdder(10, 10000);
        //testAtomicLongVSLongAdder(40, 200000);
        testAtomicLongVSLongAdder(20, 50000);
    }

    static void testAtomicLongVSLongAdder(final int threadCount, final int times){
        try {
            long start = System.currentTimeMillis();
            testLongAdder(threadCount, times);
            long end = System.currentTimeMillis() - start;
            System.out.println("条件>>>>>>线程数:" + threadCount + ", 单线程操作计数" + times);
            System.out.println("结果>>>>>>LongAdder方式增加计数" + (threadCount * times) + "万次,共计耗时:" + end);

            long start2 = System.currentTimeMillis();
            testAtomicLong(threadCount, times);
            long end2 = System.currentTimeMillis() - start2;
            System.out.println("条件>>>>>>线程数:" + threadCount + ", 单线程操作计数" + times);
            System.out.println("结果>>>>>>AtomicLong方式增加计数"+ (threadCount * times) +"万次,共计耗时:" + end2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    static void testAtomicLong(final int threadCount, final int times) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(10);
        AtomicLong atomicLong = new AtomicLong();
        List list = new ArrayList<>();
        for (int i=0;i list = new ArrayList<>();
        for (int i=0;i



测试环境

  • 系统:OS X
  • 版本:10.11.6
  • 处理器:2.7GHz Intel Core i5
  • 内存: 8GB

测试结果和结论

JDK 8新特性LongAdder和AtomicLong的性能测试对比_第1张图片
综述:线程数越多,并发操作数越大,LongAdder的优势逐渐体现出来。具体值:线程数>20, 单线程并发>5w次以上,LongAdder开始产生优势,当单线程并发>20w后,优势非常明显。
以上数据仅限本人本机,不同环境不同操作情况,在确定并发线程数量情况下,其并发操作数临界值是确定的,但各个环境测试出来的值却不一定相同。需要由线程数和并发操作数共同决定临界值。

你可能感兴趣的:(java)