Java8 引入的,相比是比较新的一个类
高并发下LongAdder比AtomicLong效率高,不过本质是空间换时间
竞争激烈的情况下,LongAdder把不同线程对应到不同的cell上进行修改,降低了冲突的概率,是多段锁的概念,提高了并发性
多线程情况下AtomicLong的性能,有16个线程对同一个AtomicLong累加
由于竞争很激烈,每一次加法,都要flush和refresh,导致很耗费资源
AtomicLong弊端:每次加法都需要做同步
// AtomicLong
public 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;
}
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
atomicLong.getAndIncrement();
}
}
}
//LongAdder
public 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;
}
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
longAdder.increment();
}
}
}