【日常开发】Java静态变量实际问题解决(static关键字解析)

在处理短信发送业务时,发现发送总数异常。经过分析,确定问题是由于静态变量导致的,不同任务线程间共享了同一计数器。通过理解`static`关键字,认识到静态成员变量在类初始化时只创建一次,所有实例共享。这导致多个任务线程对同一变量进行累加,从而产生错误结果。
摘要由CSDN通过智能技术生成

需求背景

在一个发短信的业务平台中,需要统计发送短信的总数,每一个任务对应一个号码文件,每一个任务也都会new 一个新的进程来执行。

用户发来两个任务,一个号码总数为100,一个号码总数为5000。

发送完成后查看数据,发现第一个任务数据无误(总数为100),第二个数据有误(总数为5100)。

问题分析

由于数量很对应,很容易发现问题所在,应该是第二个任务累加了第一个任务的数据。

最初的想法是多线程操作一个属性造成的原因,但是每一个任务的线程都是独立运行的,且每一次都会new一个新的执行对象,也会对总数进行初始赋值,所以排除了这种可能性。

然后意识到可能是这个变量是一个被共享使用变量,两个线程操作的是一个同一个变量。这种情况可能是单例对象产生的,不过很快又排除了,在spring配置中并没有配置这个类是单例的。

在代码中又进行了查看,发现在类的成员变量中号码总数有 static 关键字修饰,恍然大悟。
private static long FolderNumCount = 0;

Static关键字解析

Static变量

++静态成员变量,又称类变量,只会在类初始化的时候创建一次。
先上代码,最后讲原理。++

StaticVariable类

public class StaticVariable {
   
    // 静态变量
    private static int testStatic = 0;
    // 普通变量
    private int general = 0;
    // +1操作
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值