宁波网站推广厂家排名,网站优化哪里可以做,做效果图的网站,公司网页介绍Java怎么实现一个线程安全的计数器?以下是实现线程安全计数器的几种常见方法#xff0c;根据场景选择最优方案#xff1a; 方法1#xff1a;使用 AtomicLong#xff08;推荐轻量级场景#xff09;
import java.util.concurrent.atomic.AtomicLong;public class AtomicCo…Java怎么实现一个线程安全的计数器?以下是实现线程安全计数器的几种常见方法根据场景选择最优方案 方法1使用 AtomicLong推荐轻量级场景
import java.util.concurrent.atomic.AtomicLong;public class AtomicCounter {private final AtomicLong count new AtomicLong(0);public void increment() {count.incrementAndGet(); // 原子性1}public long get() {return count.get();}
}特点
基于CASCompare-And-Swap实现无锁竞争高性能适合低/中并发场景如QPS 10万 方法2synchronized 关键字
public class SynchronizedCounter {private long count 0;public synchronized void increment() {count; // 同步块保证原子性}public synchronized long get() {return count;}
}特点
简单直接但锁粒度粗高并发时性能下降适合代码维护性优先的场景 方法3LongAdder推荐高并发场景
import java.util.concurrent.atomic.LongAdder;public class LongAdderCounter {private final LongAdder count new LongAdder();public void increment() {count.increment(); // 分段CAS降低竞争}public long get() {return count.sum();}
}特点
JDK8 引入分段累加避免CAS自旋吞吐量极高适合超高并发计数如秒杀系统计数器 方法4ReentrantLock需灵活控制时
import java.util.concurrent.locks.ReentrantLock;public class LockCounter {private long count 0;private final ReentrantLock lock new ReentrantLock();public void increment() {lock.lock();try {count;} finally {lock.unlock(); // 必须finally释放锁}}
}特点
比 synchronized 更灵活可尝试锁、可中断等适合需要复杂锁控制的场景 性能对比参考基准测试
实现方式10线程/100万次操作耗时适用场景AtomicLong~120ms通用场景LongAdder~50ms超高并发写入synchronized~600ms低并发或遗留系统ReentrantLock~300ms需要锁高级功能时
选型建议
优先选 LongAdderJDK8或 AtomicLong需要阻塞控制时再用 ReentrantLock传统项目可用 synchronized 简化代码