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