多线程并发变量作用域及执行速度造成获取的数据错误

接到同事的问题反馈报告,说之前的守护程序在获取部分配置的时候,会出现数据有时正确有时错误的情况。于是,赶紧从代码库中拖出相应版本的代码进行阅读,第一反映是这种问题应该不存在。但经过仔细测试后,确实存在这样的问题。

 

代码大致如下:

public class ServiceUserConfig extends Service{
    private int m_age;
    private int m_money; 
    public ServiceUserConfig()
    {
         super(13, 1);
     }

     private refreshUserConfig(int userId)
     {
         .......
         m_age = ...
         m_money = ...
      }

     private refreshConfig(int userId)
     {
         .......
      }

     public UserOutputBuffer excute(int userId)
     {
         UserOutputBuffer outbuf = new UserOutputBuffer();

         refreshUserConfig(userId);
         refreshConfig(userId);

         outbuf.append(m_age);

         outbuf.append(m_money);
     }
}

 如果多个线程并发执行以上代码,可能会出现如下情况:

A线程执行excute(15)

B线程执行excute(17)

refreshConfig()需要一定时间,那么可能会出现A、B线程同时执行refreshConfig()的情况,这样m_age、m_money的值均会是后面一个线程刷新的值。将append提前可以解决部分问题,但仍是指标不治本。

 

稍后得花点时间将之前的这种设计模式做一定调整,在此先记录一下。

 

之前,一直觉得原来的同事这个框架做得还健壮,没想到还存在这样的问题。以后得花时间看看所有的代码了,做到提前知晓心理有数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值