`
victorwmh
  • 浏览: 212855 次
  • 性别: 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、C++等支持并发编程的语言中。线程安全通常指的是当多...同时,这也提醒我们在编程时要时刻注意变量的作用域和生命周期,以及它们与多线程环境的交互。

    Java多线程与并发系列22道高频面试题(附思维导图和答案解析)

    Java多线程与并发系列知识点 Java多线程与并发系列知识点是Java开发人员面试中经常被问到的一个重要话题。理解多线程与并发编程的知识,可以帮助开发人员更好地编写高效、可靠的Java程序。本文总结了Java多线程与...

    18 线程作用域内共享变量—深入解析ThreadLocal.pdf

    传统的解决方案包括使用`Atomic`类、`volatile`关键字以及`synchronized`关键字来保证多线程环境下的数据一致性。然而,这些同步机制并不总是最优解,特别是在需要线程内共享变量且避免线程间干扰的情况下。此时,`...

    java内置对象作用域

    集合对象的作用域由程序员定义,可以是局部变量,也可以是成员变量,取决于数据需要在何处使用和管理。 8. **反射对象(Class, Field, Method)** 反射机制允许程序在运行时动态地获取类的信息并调用方法。Class...

    Objective-C 2.0 with Cocoa Foundation--- 7,对象的初始化以及实例变量的作用域

    在Objective-C中,对象的初始化和实例变量的作用域是编程中的关键概念,对于理解和创建健壮的iOS和macOS应用程序至关重要。 首先,让我们深入理解对象的初始化过程。在Objective-C中,初始化通常涉及`init`方法。每...

    QT中sqlite多线程操作4个注意问题

    ### QT中sqlite多线程操作4个注意问题 在开发基于Qt的应用程序时,经常会遇到需要使用多线程来进行SQLite数据库操作的情况。然而,多线程环境下的数据库操作相较于单线程来说更为复杂,需要特别注意一些细节问题,...

    多线程编程指南.pdf

    **设置/获取互斥锁的范围**:控制互斥锁的作用域,是私有的还是共享的。 **设置/获取互斥锁的类型属性**:定义互斥锁的工作模式。 **设置/获取互斥锁属性的协议**:确定线程在等待互斥锁时的行为。 **设置/获取互斥...

    C++多线程 最简易的多线程程序

    在C++编程中,多线程是一种常见的技术,它允许程序同时执行多个任务,从而提高程序的并发性和效率。在本“C++多线程 最简易的多线程程序”中,我们将探讨如何使用C++11及更高版本提供的线程库来创建和管理线程。这个...

    2023-04-06-项目笔记 - 第七十阶段 - 4.4.2.68全局变量的作用域-68 -2024.03.12

    - **多线程安全性**:在多线程环境中,如果没有适当的同步机制,对全局变量的并发访问可能导致数据不一致。 #### 四、小分享 1. **坚持提交 Gitee**:定期将代码提交到版本控制系统(如Gitee)是非常重要的,这有...

    java 并发编程 多线程

    ### Java并发编程与多线程知识点详解 #### 1. 线程安全与锁定机制 - **确保线程安全**: 在Java并发编程中,确保线程安全是至关重要的。通常有三种方法来实现这一点: - 使用`synchronized`关键字:这是最基本的...

    C++多线程编程介绍,技巧及注意要点.pptx

    总的来说,C++11和C++14提供的多线程工具集让开发者能够有效地利用多核处理器,但同时也需要理解并发编程中的挑战,如数据竞态、内存序以及同步机制。在编写多线程代码时,确保对这些概念有深入的理解,才能编写出...

    多线程的互斥访问临界资源

    在多线程编程中,临界资源是指同一时间只能被一个线程访问的共享资源,例如内存中的某个变量、数据库连接或硬件设备等。当多个线程试图同时访问临界资源时,可能会导致数据不一致或者竞态条件,从而引发错误。为了...

    C++ 多线程综合技术篇

    在C++编程中,多线程技术是一种关键的并发处理机制,它允许程序同时执行多个独立的任务,从而提高系统的效率和响应性。本综合技术篇将深入探讨C++中的多线程概念、实现方法以及常见问题。 一、线程基础 线程是操作...

    实验一 :WindowsThreads多线程编程实验

    6. **线程局部存储(TLS)**:线程局部存储是为每个线程提供独立变量存储的一种方式,即使这些变量在全局作用域内定义,也能保证各线程之间的数据隔离。 7. **WinPi(Windows Portable Executable)**:在Windows...

    一种基于类的Java多线程程序数据竞争静态检测算法.pdf

    总的来说,这种基于类的Java多线程程序数据竞争静态检测算法,通过整合函数调用链和静态切片分析,为开发者提供了一种有效预防和解决数据竞争问题的工具,对于改善多线程并发软件的质量和稳定性具有重要的理论与实践...

    java并发规范(线程及锁).docx

    Java并发编程规范是Java开发中不可或缺的一部分,遵循这些规范能够帮助我们编写出更稳定、高效且易于维护的多线程程序。以下是对给定文件中提及的一些关键知识点的详细解释: 1. **指定线程名称**:在创建线程或...

    1工作临时-servlet 多线程问题

    在这个场景下,可能的问题可能是由于Servlet在处理高并发请求时,由于多线程并发访问共享资源导致的线程安全问题。 在Java Web环境中,Servlet容器(如Tomcat、Jetty等)会为每个HTTP请求创建一个新的线程来处理,...

Global site tag (gtag.js) - Google Analytics