文章目录
多线程修改同一个整数变量的值时, 可以使用
java
的原子类
AtomicLong
等. 但通过分析
ConcurrentHashMap
, 发现还有一种通过
空间
换
时间
的优化措施
java.util.concurrent.atomic.LongAdder
先上结论
结论
32线程百万次自增操作 | 耗时 |
---|---|
AtomicLong | 626毫秒 |
LongAdder | 83毫秒 |
测试过程
以下是AtomicLong
与LongAdder
运行测试代码 (32个线程, 每个线程执行100万次自增操作)
AtomicLong的测试过程
public static void atomicLong() throws Throwable {
final int threadCount = 32;
final AtomicLong longValue = new AtomicLong();
Thread[] threads = new Thread[threadCount];
for(int i=0; i<threadCount; i++){
threads[i] = new Thread(new Runnable() {
@Override
public void run() {
for(int i=0; i<100*10000; i++){
longValue.incrementAndGet();
}
}
});
}
long time = System.nanoTime();
for(int i=0; i<threadCount; i++){
threads[i].start();
}
for(int i=0; i<threadCount; i++){
threads[i].join();
}
logger.info("value: {}, time: {}", longValue.get(), System.nanoTime() - time);
}
多次执行结果
625396610
626169232
611343737
614837069
633110850
606656120
LongAdder的测试过程
public static void longAdder() throws Throwable {
final int threadCount = 32;
final LongAdder longAdder = new LongAdder();
Thread[] threads = new Thread[threadCount];
for(int i=0; i<threadCount; i++){
threads[i] =