关于C++中实现单例模式的一些思考
2011-03-26 15:29
447 查看
学会使用单例模式是在看了《大话设计模式》以后会的,大话是用C#实现的,于是我把它转成了C++实现,代码如下:
class sg{
private:
sg(){}
public:
~sg(){}
static sg* GetInstance(){
if(instance == null){
instance = new sg();
}
return instance;
}
private:
static sg* instance;
};
//cpp
sg* sg::instance = null;
(上面的代码可能会有错,因为是临时直接写的)
使用后发现这个东西很不错,不过这个学期就悲剧了,写了一个多线程的程序,然后上面的这个单例模式就不给力了。。。原因在于多线程的时候会New很多次。然后我再看大话,发现大话里面有种双锁法,具体的大家可以去翻翻,这里就不写代码了。
不过我觉得大话的双锁法有些繁琐,而且要用到windows的API,而我用的是QT,所以就不太想用这种方法。于是就想了另一种相对简单的方式,代码如下:
class sg{
private:
sg(){}
public:
~sg(){}
static sg& GetInstance(){
return instance;
}
private:
static sg instance;
};
sg sg::instance;
注意差别就是这里不再使用指针了,这样的话在第一次调用的时候Instance就初始化,然后以后就一直返回它,这样就不会出现多线程时产生多个对象的情况~
不过这个方法是有缺陷的,比较耗空间,而且在第一次初始化的时候万一出现了多线程问题也是解决不了的。
(当然一种方法是使用boost~)
class sg{
private:
sg(){}
public:
~sg(){}
static sg* GetInstance(){
if(instance == null){
instance = new sg();
}
return instance;
}
private:
static sg* instance;
};
//cpp
sg* sg::instance = null;
(上面的代码可能会有错,因为是临时直接写的)
使用后发现这个东西很不错,不过这个学期就悲剧了,写了一个多线程的程序,然后上面的这个单例模式就不给力了。。。原因在于多线程的时候会New很多次。然后我再看大话,发现大话里面有种双锁法,具体的大家可以去翻翻,这里就不写代码了。
不过我觉得大话的双锁法有些繁琐,而且要用到windows的API,而我用的是QT,所以就不太想用这种方法。于是就想了另一种相对简单的方式,代码如下:
class sg{
private:
sg(){}
public:
~sg(){}
static sg& GetInstance(){
return instance;
}
private:
static sg instance;
};
sg sg::instance;
注意差别就是这里不再使用指针了,这样的话在第一次调用的时候Instance就初始化,然后以后就一直返回它,这样就不会出现多线程时产生多个对象的情况~
不过这个方法是有缺陷的,比较耗空间,而且在第一次初始化的时候万一出现了多线程问题也是解决不了的。
(当然一种方法是使用boost~)
相关文章推荐
- Python 实现单例模式的一些思考
- 关于基于Event Sourcing模式实现的领域模型如何处理模型重构的问题的思考
- 关于单例模式的一些思考
- 关于寻路算法的一些思考(3):A*算法的实现
- 关于企业应用SAP成本管理模式与方法的一些思考
- 关于设计模式的一些看法与思考
- 关于安卓里实现监听器回调模式的运用,自己的一些概括理解和总结
- 关于如何实现C++跨平台的一些想法
- 【微信支付】分享一个失败的案例 跨域405(Method Not Allowed)问题 关于IM的一些思考与实践 基于WebSocketSharp 的IM 简单实现 【css3】旋转倒计时 【Html5】-- 塔台管制 H5情景意识 --飞机 谈谈转行
- 关于C++和C#的自定义数据类型转换的一些思考
- 关于C++友元的一些思考
- 关于单例模式这种比上面1、2都好一些,既实现了线程安全,又避免了同步带来的性能影响。
- 关于c++中继承和虚函数的一些思考
- 关于寻路算法的一些思考(3):A*算法的实现
- 关于c++中一些指针问题的思考
- 关于DCLP实现的单例模式的一些想法
- 单例模式中关于懒汉式实现方式的哲学思考
- 关于linux中nat实现的一些思考
- 关于linux中nat实现的一些思考
- 关于软件架构设计的一些思考--通用架构设计模式