接到同事的问题反馈报告,说之前的守护程序在获取部分配置的时候,会出现数据有时正确有时错误的情况。于是,赶紧从代码库中拖出相应版本的代码进行阅读,第一反映是这种问题应该不存在。但经过仔细测试后,确实存在这样的问题。
代码大致如下:
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提前可以解决部分问题,但仍是指标不治本。
稍后得花点时间将之前的这种设计模式做一定调整,在此先记录一下。
之前,一直觉得原来的同事这个框架做得还健壮,没想到还存在这样的问题。以后得花时间看看所有的代码了,做到提前知晓心理有数。