Java中static变量天然适合做运行期间计数统计,因其属于类、所有对象共享且生命周期贯穿程序全程;单线程可用public static int直接累加,多线程须用AtomicInteger或synchronized保证原子性。

Java 中 static 变量天然适合做运行期间的计数统计,因为它属于类而非实例,所有对象共享同一份内存空间,且生命周期贯穿整个程序运行期。
static 变量的基本计数原理
static 变量在类加载时初始化一次,后续所有对象访问的是同一个变量。只要不被显式重置或 JVM 退出,它的值会持续累积。
- 定义为 public static int count = 0; 即可作为全局计数器
- 每次创建对象、调用方法或触发事件时,执行 count++ 或 count += n
- 多线程环境下需注意线程安全,否则可能出现丢失更新
单线程场景下的简单实现
适用于工具类、测试代码或明确单线程运行的逻辑:
public class RequestCounter {
public static int totalRequests = 0;
public static void recordRequest() {
totalRequests++;
}
public static int getTotal() {
return totalRequests;
}
}
调用 RequestCounter.recordRequest() 即可累加,RequestCounter.getTotal() 获取当前总数。
立即学习“Java免费学习笔记(深入)”;
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
多线程环境下的安全计数
多个线程同时修改 static 变量可能引发竞态条件。推荐使用以下任一方式保证原子性:
- 用 AtomicInteger 替代普通 int:它提供线程安全的 incrementAndGet()、addAndGet(n) 等方法
- 对操作块加 synchronized(如同步静态方法或锁住类 Class 对象)
- 避免使用 volatile —— 它不能保证复合操作(如 i++)的原子性
示例:
public class ThreadSafeCounter {
private static final AtomicInteger counter = new AtomicInteger(0);
public static int increment() {
return counter.incrementAndGet();
}
public static int get() {
return counter.get();
}
}
结合业务逻辑的典型用法
计数器常用于监控、限流、调试等场景:
- 统计某类对象创建次数:在构造方法中调用计数器自增
- 记录接口调用总量:在 Controller 或 Service 方法入口处累加
- 追踪异常发生频次:catch 块内增加错误计数
- 配合 static final 实现只读统计(如启动后只增不减)
注意不要在类卸载(如热部署)时依赖 static 计数器的“永久性”,因为类卸载后 static 变量也会被回收。

















