Java8 引入的,相比是比较新的一个类
高并发下LongAdder比AtomicLong效率高,不过本质是空间换时间
竞争激烈的情况下,LongAdder把不同线程对应到不同的cell上进行修改,降低了冲突的概率,是多段锁的概念,提高了并发性
多线程情况下AtomicLong的性能,有16个线程对同一个AtomicLong累加
由于竞争很激烈,每一次加法,都要flush和refresh,导致很耗费资源
AtomicLong弊端:每次加法都需要做同步
// AtomicLongpublic class AtomicLongDemo {public static void main(String[] args) {AtomicLong atomicLong = new AtomicLong(0);ExecutorService executorService = Executors.newFixedThreadPool(20);long start = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {executorService.submit(new Task(atomicLong));}executorService.shutdown();while (!executorService.isTerminated()){}long end = System.currentTimeMillis();System.out.println(end-start);System.out.println(atomicLong.get());}}class Task implements Runnable{public AtomicLong atomicLong;public Task(AtomicLong atomicLong) {this.atomicLong = atomicLong;}@Overridepublic void run() {for (int i = 0; i < 10000; i++) {atomicLong.getAndIncrement();}}}//LongAdderpublic class LongAdderDemo {public static void main(String[] args) {LongAdder longAdder = new LongAdder();ExecutorService executorService = Executors.newFixedThreadPool(20);long start = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {executorService.submit(new TaskAdder(longAdder));}executorService.shutdown();while (!executorService.isTerminated()){}long end = System.currentTimeMillis();System.out.println(end-start);System.out.println(longAdder.sum());}}class TaskAdder implements Runnable{public LongAdder longAdder;public TaskAdder(LongAdder atomicLong) {this.longAdder = atomicLong;}@Overridepublic void run() {for (int i = 0; i < 10000; i++) {longAdder.increment();}}}
