接到同事的问题反馈报告,说之前的守护程序在获取部分配置的时候,会出现数据有时正确有时错误的情况。于是,赶紧从代码库中拖出相应版本的代码进行阅读,第一反映是这种问题应该不存在。但经过仔细测试后,确实存在这样的问题。
代码大致如下:
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多线程与并发系列知识点 Java多线程与并发系列知识点是Java开发人员面试中经常被问到的一个重要话题。理解多线程与并发编程的知识,可以帮助开发人员更好地编写高效、可靠的Java程序。本文总结了Java多线程与...
传统的解决方案包括使用`Atomic`类、`volatile`关键字以及`synchronized`关键字来保证多线程环境下的数据一致性。然而,这些同步机制并不总是最优解,特别是在需要线程内共享变量且避免线程间干扰的情况下。此时,`...
集合对象的作用域由程序员定义,可以是局部变量,也可以是成员变量,取决于数据需要在何处使用和管理。 8. **反射对象(Class, Field, Method)** 反射机制允许程序在运行时动态地获取类的信息并调用方法。Class...
在Objective-C中,对象的初始化和实例变量的作用域是编程中的关键概念,对于理解和创建健壮的iOS和macOS应用程序至关重要。 首先,让我们深入理解对象的初始化过程。在Objective-C中,初始化通常涉及`init`方法。每...
### QT中sqlite多线程操作4个注意问题 在开发基于Qt的应用程序时,经常会遇到需要使用多线程来进行SQLite数据库操作的情况。然而,多线程环境下的数据库操作相较于单线程来说更为复杂,需要特别注意一些细节问题,...
**设置/获取互斥锁的范围**:控制互斥锁的作用域,是私有的还是共享的。 **设置/获取互斥锁的类型属性**:定义互斥锁的工作模式。 **设置/获取互斥锁属性的协议**:确定线程在等待互斥锁时的行为。 **设置/获取互斥...
在C++编程中,多线程是一种常见的技术,它允许程序同时执行多个任务,从而提高程序的并发性和效率。在本“C++多线程 最简易的多线程程序”中,我们将探讨如何使用C++11及更高版本提供的线程库来创建和管理线程。这个...
- **多线程安全性**:在多线程环境中,如果没有适当的同步机制,对全局变量的并发访问可能导致数据不一致。 #### 四、小分享 1. **坚持提交 Gitee**:定期将代码提交到版本控制系统(如Gitee)是非常重要的,这有...
### Java并发编程与多线程知识点详解 #### 1. 线程安全与锁定机制 - **确保线程安全**: 在Java并发编程中,确保线程安全是至关重要的。通常有三种方法来实现这一点: - 使用`synchronized`关键字:这是最基本的...
总的来说,C++11和C++14提供的多线程工具集让开发者能够有效地利用多核处理器,但同时也需要理解并发编程中的挑战,如数据竞态、内存序以及同步机制。在编写多线程代码时,确保对这些概念有深入的理解,才能编写出...
在多线程编程中,临界资源是指同一时间只能被一个线程访问的共享资源,例如内存中的某个变量、数据库连接或硬件设备等。当多个线程试图同时访问临界资源时,可能会导致数据不一致或者竞态条件,从而引发错误。为了...
在C++编程中,多线程技术是一种关键的并发处理机制,它允许程序同时执行多个独立的任务,从而提高系统的效率和响应性。本综合技术篇将深入探讨C++中的多线程概念、实现方法以及常见问题。 一、线程基础 线程是操作...
6. **线程局部存储(TLS)**:线程局部存储是为每个线程提供独立变量存储的一种方式,即使这些变量在全局作用域内定义,也能保证各线程之间的数据隔离。 7. **WinPi(Windows Portable Executable)**:在Windows...
总的来说,这种基于类的Java多线程程序数据竞争静态检测算法,通过整合函数调用链和静态切片分析,为开发者提供了一种有效预防和解决数据竞争问题的工具,对于改善多线程并发软件的质量和稳定性具有重要的理论与实践...
Java并发编程规范是Java开发中不可或缺的一部分,遵循这些规范能够帮助我们编写出更稳定、高效且易于维护的多线程程序。以下是对给定文件中提及的一些关键知识点的详细解释: 1. **指定线程名称**:在创建线程或...
在这个场景下,可能的问题可能是由于Servlet在处理高并发请求时,由于多线程并发访问共享资源导致的线程安全问题。 在Java Web环境中,Servlet容器(如Tomcat、Jetty等)会为每个HTTP请求创建一个新的线程来处理,...