由于单例和static在内存中的存放位置不一样,而有些应用不管是使用单例还是使用static都是为了共用某个成员,如果混合使用,比如单例里面又使用了static,就会导致某些成员不能保持一致。
最好的解决方案是如果使用了单例,那么单例里成员就不要再使用static,也不要使用static的全局变量。但是如果我设计这个class时还不确定是否使用单例,那可以使用static,只是单例时不使用这个static成员即可。
原有流程:
<!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Visio.Drawing.11" ShapeID="_x0000_i1025" DrawAspect="Content" ObjectID="_1437833746"> </o:OLEObject> </xml><![endif]-->
改造后流程:
<!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Visio.Drawing.11" ShapeID="_x0000_i1026" DrawAspect="Content" ObjectID="_1437833748"> </o:OLEObject> </xml><![endif]-->
DetailbillMgr.h,增加成员变量m_AltibaseIntf
classDetailbillMgr
{
public:
DetailbillMgr()
{
m_AltibaseIntf = NULL;
}
protected:// 改为private
abdb::AltibaseIntf * m_AltibaseIntf;
};
DetailbillMgr.cpp,原来abdbi指向一个static的AltibaseIntf,改为指向DetailbillMgr的成员变量
abdb::AltibaseIntf * abdbi;
if(m_AltibaseIntf==NULL)
{
m_AltibaseIntf = new abdb::AltibaseIntf;
}
m_AltibaseIntf = abdb::connectAltibase(m_AltibaseIntf);
abdbi = m_AltibaseIntf;
改造前:
abdb::AltibaseIntf * abdbi = abdb::AltibaseIntf::getInstance();
abdbi = abdb::connectAltibase(abdbi);
AltibaseIntf.h,AltibaseIntf增加成员变量curTimeStamp,取代原有的static全局变量
classAltibaseIntf {
public:
stringcurTimeStamp;
};
AcctConnection.cpp,把原有的static变量curTimeStamp注释掉,采用新加的成员变量curTimeStamp
//当前时间戳
//static string curTimeStamp("");
if(handle->curTimeStamp < timeStamp)
{
handle->disConnect();
handle->setConnInfo(abdbUser, abdbPassWd, abdbDsn, abdbPort);
handle->connect();
handle->curTimeStamp = timeStamp;
}
改造后,用tuxedo单个测试,调用了5次没问题,第一次连接数据库,后面四次都不连接数据库。
用批量并发测试,tuxedo进程自增长后不报错,降落后也不报错。
相关推荐
标题“基于C#的应用程序单例唯一运行的完美解决方案”所指的就是如何在C#环境下实现一个应用的单例模式,确保程序在操作系统中只能有一个实例在运行。实现这个目标通常涉及到进程级别的检查和互斥量(Mutex)的使用...
关于反序列化解决方案,Android中如果单例对象实现了Serializable接口,可能会在反序列化过程中被多次创建。为了避免这种情况,可以在单例类中添加`readResolve()`方法: ```java public class ...
##### 线程安全问题及解决方案 上述实现未考虑线程安全问题,可能导致多实例的产生。为解决这一问题,有以下几种方案: 1. **在`getInstance`方法上加同步关键字**:简单但效率较低。 ```java public static ...
在软件工程领域,设计模式是一套被广泛接受的解决特定问题的解决方案模板。其中,“单例模式”是一种常用的创建型设计模式,它保证一个类仅有一个实例,并提供一个全局访问点。在ActionScript 3.0 (AS3) 中应用单例...
在软件工程中,设计模式是一种在特定场景下解决常见问题的标准方案,可以被复用并提升代码质量。单例模式是设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式常用于控制共享资源,如...
尽管双重检查锁定提供了一种较好的解决方案,但还存在一些问题。例如,在某些情况下,对象创建过程可能会被JVM指令重排序,导致线程A创建的对象尚未完全构造完成,而线程B已经能够访问到这个半成品对象。为了避免这...
同时,随着Java技术的发展,枚举单例、基于依赖注入的单例等新型实现方式也逐渐流行,它们提供了更好的解决方案,避免了传统单例模式的一些问题。在阅读《浅议单例模式之线程安全.doc》文档时,可以深入理解这些细节...
另一个解决方案是使用双重检查锁定机制(Double-Checked Locking)来实现线程安全的单例模式。这种方法可以减少 synchronize 的使用,从而提高系统的性能。 ```java public class Singleton { private volatile ...
### 单例模式详解 #### 概述与应用场景 单例模式是一种常用的设计模式,它的主要目的是确保某个类仅有一个实例...通过上述讨论,我们可以看到单例模式在不同场景下的适用性及其潜在问题,并学习到了相应的解决方案。
设计模式是软件工程中的一种最佳实践,用于解决常见的设计问题并提供可重用的解决方案。在给定的标题和描述中,我们关注的是两种重要的设计模式:单例模式和观察者模式。 首先,让我们深入了解单例模式。单例模式是...
### 单例模式面试深入探讨及终极解决方案 #### 引言 在软件开发领域,面试是评估应聘者技能的关键环节之一。单例模式作为一种常见的设计模式,在面试中常常被用来测试候选人的基础知识与深入理解能力。本文将从一个...
- **解决方案**:通过`synchronized`关键字实现线程安全。 - **懒汉模式变形一**:将整个`getInstance`方法声明为`synchronized`。 ```java public class Single4 { private Single4() {} // 同步方法 public ...
### ASP.NET 中 C++ 单例模式实现的问题与解决方案 #### 概述 单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。在跨语言环境中,比如C++与ASP.NET结合的场景下,单例模式的实现...
它们都是为了解决特定的问题而提出的解决方案,但有着不同的应用场景和设计思路。 **单例模式** 是一种限制类实例化次数的模式,确保一个类在整个程序运行过程中只有一个实例存在。这种模式通常用于管理共享资源...
在软件工程与编程领域,设计模式是解决特定问题的一套被广泛接受的解决方案。其中,单例模式(Singleton Pattern)是一种常用的创建型模式,其核心在于确保一个类只有一个实例,并提供一个全局访问点。这种模式在...
单例模式是一种设计模式,它控制了类的实例化过程,确保一个类只有一个实例...虽然它有一定的局限性,但在特定场景下,比如资源管理,它可以提供高效的解决方案。理解并熟练运用单例模式是提升PHP编程能力的重要一环。
在名为`test_dispatch_once`的示例项目中,开发者可能创建了一个使用`dispatch_once`初始化的单例,用于演示如何在iOS应用中正确地实施这一模式。这个demo可能包含了如何创建和使用单例,以及如何结合`dispatch_once...
在Java中,单例模式非常有用,尤其是在需要控制对象创建过程或者确保整个应用程序中某个类只有一个实例的情况下。 #### 二、单例模式的优点 1. **实例控制**:单例模式确保所有对象都访问同一个实例,从而避免了多...
登记式单例模式通常用于类似于Spring框架中的bean管理方式,即在单例类中维护一个容器或注册表,将类名及其对应的实例注册进去,之后可以通过查询注册表来获取相应的单例实例。 ##### 代码示例: ```java import ...