读书人

多线程并发变量作用域及执行速度造成获

发布时间: 2012-10-08 19:54:56 作者: rapoo

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

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

?

代码大致如下:

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提前可以解决部分问题,但仍是指标不治本。

?

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

?

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

读书人网 >软件架构设计

热点推荐