singleton 模式的多线程安全创建
来源:互联网 发布:c语言指针和变量的区别 编辑:程序博客网 时间:2024/05/19 22:48
单例模式是通过类的静态函数直接获取对象,并且通过静态变量的特性保证一个进程只有一个该对象。这种模式的类在UML 里与其他类关系通常只是表现为“依赖”关系而已,应该说这个模式可以在设计上一定程度上帮我们解耦。其通常设计如下:
class A{
public:
static A* CreateInstance()
{
static A* pInstance =NULL;
if( pInstance==NULL)
pInstance= new A();
return pInstance;
}
};
但createinstance 函数可能在多线程下出现 同时被new 的情况,这个就不符合我们的想法了。
为了在多线程下正确使用,改进如下:
class A {
static A* CreateInstance()
{
static A* pInstance =NULL;
if( pInstance==NULL)
{EnterCriticSection(&g_cs);
if(pInstance==NULL)
{
pInstance = new A();
}
LeaveCriticSection(&g_cs);
}
return pInstance ;
};
代码里 我们必须连续检查2次pInstance变量,因为第一次判断 与entercriticSection 之间 ,pInstance 的值是有可能变化的。
上面使用criticalSection 变量,太过繁琐,我们使用 Interlock 函数来简化处理:
class A{
public:
static A* CreateInstance()
{
volatile static A* pInstance =NULL;
if( pInstance==NULL)
{
A * pnew = new A();
if(InterlockedCompareExchangePointer((volatile PVOID *)&pInstance,pnew,NULL) !=NULL)
{ // 失败,表示别的线程抢在当前线程前创建了该对象
delete pnew;
}
}
return (static A*) pInstance;
}
};
这个里我们再通过模板构建一个通用的singleton创建器:
template<class T>
class SingleCreator {
public:
static T* CreateInstance()
{
volatile static T* pInstance =NULL;
if( pInstance==NULL)
{
T * pnew = new A();
if(InterlockedCompareExchangePointer((volatile PVOID *)&pInstance,pnew,NULL) !=NULL)
{ // 失败,表示别的线程抢在当前线程前创建了该对象
delete pnew;
}
}
}
};
- singleton 模式的多线程安全创建
- C++实现多线程安全的单体模式(Singleton)
- 细说Singleton模式:创建、多线程与销毁
- 细说Singleton模式:创建、多线程与销毁
- 细说Singleton模式:创建、多线程与销毁
- 如何创建线程安全的单例模式?线程安全的Singleton!
- SingleTon模式的多线程环境
- 多线程安全的Singleton单件模式在C++,java与C#下的实现
- 多线程安全 Singleton
- Spring中Singleton模式的线程安全
- Spring中Singleton模式的线程安全
- Spring中Singleton模式的线程安全
- Spring中Singleton模式的线程安全
- Spring中Singleton模式的线程安全
- 创建模式:Singleton模式
- C++多线程Singleton模式
- 基于double lock的多线程安全的Singleton实现要点
- singleton 线程安全的singleton
- shell ---> \;和` `
- 主要的4种最短路算法
- Python 循环小结,写给自己的
- C++中多态如何在编译期和运行期实现
- 数据库优化方案(一)
- singleton 模式的多线程安全创建
- 黑马程序员---java 内部类
- [分享]Java 线程池的原理与实现
- nohup命令的应用
- MySQL新建用户,授权,删除用户,修改密码
- mahout转
- 关于推送的执行顺序
- 关于Google Analytic使用心得
- Git使用基础篇