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 秒破亿次累加. 翻倍的性能提升.
来源: http://www.bubuko.com/infodetail-2990083.html