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