`
victorwmh
  • 浏览: 207273 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多

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

 

代码大致如下:

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

 

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

 

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

分享到:
评论

相关推荐

    java学习整理文档.docx

    最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”或者在Bean对象中尽量避免定义可变的成员变量(使用局部变量)。 使用同步synchronized(以时间换空间),仅提供一份变量,让不同的线程...

    网络编程教程,很好的一本写linux网络编程书,这是我上传的源码

     15.3.3 多进程的并发服务器和多线程的并发服务器  15.3.4 客户端进程的多线程化  本章小结 第十六章 网络售票系统的简单模拟  16.1 系统的总体设计  16.1.1 应用的说明  16.1.2 数据格式的...

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    局部变量与全局变量作用域 递归 函数式编程与函数不同 高阶函数 第4周 上节内容回顾 心灵鸡汤 装饰器详解 装饰器应用详解 装饰器之函数即变量 装饰器之高阶函数 装饰器之嵌套函数 装饰器之案例剖析 装饰器之高潮...

    UNIX操作系统教程 张红光

    Window及其他实用程序292 14.1X-Window292 14.1.1X-Window的特征292 14.1.2X-Window的工作方式293 14.1.3X-Window的组成部件294 14.1.4X-Window编程环境介绍295 14.2数据检索加工工具awk296 14.2.1awk基本描述296 ...

    Go程序设计语言

    302.6.1 导入 312.6.2 包初始化 332.7 作用域 34[0第0]3章 基本数据 383.1 整数 383.2 浮点数 423.3 复数 453.4 布尔值 473.5 字符串 473.5.1 字符串字面量 493.5.2 Unicode 493.5.3 UTF-8 503.5.4 ...

    python入门到高级全栈工程师培训 第3期 附课件代码

    03 函数作用域补充 04 匿名函数 05 函数式编程介绍 06 函数式编程尾递归调用优化 07 map函数 08 map函数filter函数 09 reduce函数 10 map reduce filter总结 11 内置函数part1 第17章 01 课前吹牛 02 zip方法 03 ...

    net学习笔记及其他代码应用

    答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 40.接口是否可...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    3.2.1 定义局部作用域 48 3.2.2 定义类的作用域 49 3.2.3 重载方法 50 3.3 编写方法 50 3.4 使用可选参数和命名参数 57 3.4.1 定义可选参数 58 3.4.2 传递命名参数 58 3.4.3 消除可选参数和命名参数的歧义 59...

    2019千峰Python超详细入门教程(百度云盘分享).docx

    作用域&修改变量作用域.mp4 │ ├─千锋Python教程:第07章 闭包&装饰器(5集) │ │ .DS_Store │ │ │ ├─code │ │ 10、多个装饰器.py │ │ 11、装饰器使用场景.py │ │ 12、计数函数执行次数.py │ │ ...

    corejava培训文档

    4.1. 变量和作用域 4.2. 操作符 4.3. 数字类型之间的转换 4.4. 强制类型转换 4.5. 转换的二种类型 4.6. 控制流 4.7. 循环语句 5. 四 数组 5.1. 声明数组 5.2. 创建数组 5.3. 初始化数组 5.4. ...

    宋劲彬的嵌入式C语言一站式编程

    4. 全局变量、局部变量和作用域 4. 分支语句 1. if语句 2. if/else语句 3. 布尔代数 4. switch语句 5. 深入理解函数 1. return语句 2. 增量式开发 3. 递归 6. 循环语句 1. while语句 2. do/while语句 3. for语句 4. ...

    javaSE代码实例

    6.7.1 局部变量的作用域 89 6.7.2 局部变量的初始化 90 6.8 this预定义对象引用 92 6.9 擅用系统已有的类 94 6.9.1 Java中的Date类 94 6.9.2 Java中的GregorianCalendar类 96 6.9.3 擅用系统已有类的...

    亮剑.NET深入体验与实战精要2

    1.3.6 变量的作用域 13 1.3.7 常量 16 1.3.8 流程控制 16 1.3.9 字符串常见操作 21 1.3.10 几个常用的数学函数 27 1.4 .NET的面向对象之门 27 1.4.1 继承——“子承父业” 28 1.4.2 委托——“任务书” 35 1.4.3 ...

    亮剑.NET深入体验与实战精要3

    1.3.6 变量的作用域 13 1.3.7 常量 16 1.3.8 流程控制 16 1.3.9 字符串常见操作 21 1.3.10 几个常用的数学函数 27 1.4 .NET的面向对象之门 27 1.4.1 继承——“子承父业” 28 1.4.2 委托——“任务书” 35 1.4.3 ...

    从J2SE到J2EE知识点介绍

    (四) 多线程 80 1. 概念与原理 80 2. 两种实现方式 81 3. 生命周期及状态转换 84 4. 线程调度 85 5. 线程同步 92 三. Jsp 101 (一) myeclipse上配置Tomcat服务器 101 (二) Jsp+servlet+bean版HelloWorld概览 105 ...

    Golang2-new.docx

    2.5. 作用域 18 2.6. 语句 19 2.7. 比较运算符 20 2.8. 类型转换 21 2.9. 控制流 23 2.9.1. If 23 2.9.2. Goto 24 2.9.3. For 25 2.9.4. Switch 25 2.9.5. break语句 31 2.9.6. Continue语句 31 3. 基础...

    C#编程经验技巧宝典

    24 <br>0050 using关键字的用法 24 <br>0051 变量的作用域 25 <br>2.5 其他 26 <br>0052 有效使用this对象 26 <br>0053 如何声明变量 26 <br>0054 如何声明相同类型的多个变量 26 ...

    软件工程-理论与实践(许家珆)习题答案

    获取足够多的问题领域的知识,需求抽取的方法一般有问卷法、面谈法、数据采集法、用例法、情景实例法以及基于目标的方法等;还有知识工程方法,例如,场记分析法、卡片分类法、分类表格技术和基于模型的知识获取等 ...

Global site tag (gtag.js) - Google Analytics