根据实际的场景使用,并发数多时,建议使用LongAdder,反之用AtomicLong
package adder;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.LongAdder;
public class AdderDemo {
private static final AtomicLong atomicLong = new AtomicLong();
private static final LongAdder longAdder = new LongAdder();
public static void main(String[] args) {
// testAtomicLong();
testLongAdder();
}
public static void testAtomicLong() {
ExecutorService executorService = Executors.newFixedThreadPool(100);
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
executorService.submit(() -> {
for (int j = 0; j < 10000; j++) {
atomicLong.incrementAndGet();
}
});
}
executorService.shutdown();
while (!executorService.isTerminated()) {
}
long end = System.currentTimeMillis();
System.out.println("AtomicLong耗时:" + (end - start));
System.out.println(atomicLong.get());
}
public static void testLongAdder() {
ExecutorService executorService = Executors.newFixedThreadPool(100);
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
executorService.submit(() -> {
for (int j = 0; j < 10000; j++) {
longAdder.increment();
}
});
}
executorService.shutdown();
while (!executorService.isTerminated()) {
}
long end = System.currentTimeMillis();
System.out.println("LongAdder耗时:" + (end - start));
System.out.println(longAdder.sum());
}
}