AtomicLong是Java中用于线程安全计数的类,基于CAS机制实现原子操作。它提供incrementAndGet、getAndIncrement、addAndGet等方法,可在高并发下高效递增或修改long型数值,无需加锁。常用于统计请求次数等共享计数场景,相比synchronized更轻量,避免数据竞争,提升性能且代码简洁。

在多线程环境下,使用普通变量进行计数容易出现线程安全问题。Java 提供了 AtomicLong 类来解决这个问题,它通过底层的 CAS(Compare-And-Swap)机制保证操作的原子性,无需使用 synchronized 关键字即可实现高效、线程安全的计数。
什么是 AtomicLong
AtomicLong 是 java.util.concurrent.atomic 包中的一个类,用于对 long 类型的值进行原子操作。它提供的 increment、decrement 和 add 等方法都是线程安全的,适合在高并发场景下替代 volatile 配合 synchronized 的方式。
基本用法:创建和递增计数器
以下是一个简单的例子,展示如何使用 AtomicLong 实现线程安全的计数:
// 创建一个 AtomicLong,初始值为 0
AtomicLong counter = new AtomicLong(0);
// 多个线程中安全地递增
counter.incrementAndGet(); // 返回递增后的值
counter.getAndIncrement(); // 先返回原值,再递增
实际应用场景示例
假设你有一个 Web 服务需要统计请求总数,多个线程同时处理请求,可以这样实现:
立即学习“Java免费学习笔记(深入)”;
BJXShop网上购物系统是一个高效、稳定、安全的电子商店销售平台,经过近三年市场的考验,在中国网购系统中属领先水平;完善的订单管理、销售统计系统;网站模版可DIY、亦可导入导出;会员、商品种类和价格均实现无限等级;管理员权限可细分;整合了多种在线支付接口;强有力搜索引擎支持... 程序更新:此版本是伴江行官方商业版程序,已经终止销售,现于免费给大家使用。比其以前的免费版功能增加了:1,整合了论坛
public class RequestCounter {
private static final AtomicLong requestCount = new AtomicLong(0);
public static void recordRequest() {
requestCount.incrementAndGet();
}
public static long getCount() {
return requestCount.get();
}
}
每个线程调用 recordRequest() 方法时,计数都会安全递增,不会发生数据竞争。
常用方法说明
AtomicLong 提供了多个原子操作方法,常用的包括:
- incrementAndGet():先加 1,再返回新值
- getAndIncrement():先返回当前值,再加 1
- addAndGet(long delta):加上指定值并返回结果
- getAndAdd(long delta):返回当前值后再加指定值
- compareAndSet(expected, newValue):如果当前值等于预期值,则更新为新值
- get():获取当前值
这些方法都基于 CPU 的原子指令实现,性能优于加锁机制。
基本上就这些。只要涉及共享的计数场景,优先考虑 AtomicLong 能有效避免线程冲突,代码更简洁且效率更高。









