java高并发计数应优先用atomicinteger/atomiclong,极高写频时换longadder;另有atomicboolean等适配不同场景,但复合操作需用compareandset循环重试。

Java 中基本数据类型做高并发计数,不能直接用 int、long 等原始类型——它们没有线程安全性。必须借助 原子类,它们基于 CPU 的 CAS 指令实现无锁原子操作,兼顾性能与安全。
优先用 AtomicInteger / AtomicLong
这是最常用、最直接的方案:
-
整数计数(如请求量、库存、PV):用
AtomicInteger,支持incrementAndGet()、decrementAndGet()、addAndGet(delta)、compareAndSet(expected, new) -
大数值或超长计数(如亿级请求统计):用
AtomicLong,方法语义一致,但支持更大范围 - 所有操作都是原子的,无需
synchronized或Lock,避免阻塞和上下文切换开销
高并发写密集时换 LongAdder
当每秒更新次数极高(例如 >10 万次)、线程数远超 CPU 核心数时,AtomicLong 的 CAS 冲突会明显上升,吞吐量下降。此时应改用 LongAdder:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 它采用“分段累加”策略:内部维护多个 Cell,线程随机写入不同槽位,最后用
sum()汇总 - 在 16 核以上服务器上,32 线程并发时,性能比
AtomicLong高 2–5 倍 - 注意:
sum()不是强实时值(可能略滞后),但对统计类场景完全适用;读多写少时反而不推荐
其他基础类型也有对应原子类
不是只有整数能安全计数:
-
AtomicBoolean:适合开关类状态,如“是否初始化完成”“是否限流中”,用compareAndSet(false, true) -
AtomicLongFieldUpdater/AtomicIntegerFieldUpdater:用于已有对象字段的原子更新,避免包装对象开销 -
AtomicDouble、AtomicFloat:支持浮点计数(如平均响应时间累加),底层通过doubleToLongBits保证精度
别踩这些坑
用了原子类不等于万事大吉:
- 复合操作不安全:比如“先
get()再set()”不是原子的,必须用compareAndSet循环重试,或改用锁 - 不要拿它存复杂状态:比如把用户登录态、配置对象引用塞进
AtomicReference当全局变量,语义混乱且难维护 - 异步场景要小心:在
CompletableFuture或线程池中使用时,确保原子变量生命周期可控,避免被意外共享或泄漏
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










