这个设计模式主要目的是想在整个系统中仅仅能出现一个类的实例。这样做当然是有必定的。比方你的软件的全局配置信息,或者是一个Factory,或是一个主控类,等等。

你希望这个类在整个系统中仅仅能出现一个实例。

一、调用pthread_once()实现了一个线程安全的版本号:

pthread_once()函数具体解释

代码:

template <class T>
class Singleton
{
public:
static T& instance()
{
pthread_once(&ponce_,&Singleton::init);
return *value_;
}
static void init()//加了一层封装,适应不同类型的初始化函数
{
value_ = new T();
}
private:
Singleton();
~Singleton();
static pthread_once_t ponce_;
static T * value_;
};
template <class T>
pthread_once_t Singleton<T>::ponce_=PTHREAD_ONCE_INIT;//Linux下初始化为0; template <class T>
T* Singleton<T>::value_=NULL;

二、双重检查加锁法

class Singleton
{
public:
static Singleton *GetInstance()
{
if (m_Instance == NULL )
{
Lock lock; // Lock为管理相互排斥锁的资源类,会在该函数退出时自己主动释放
if (m_Instance == NULL )
{
m_Instance = new Singleton ();
} }
return m_Instance;
} static void DestoryInstance()
{
if (m_Instance != NULL )
{
delete m_Instance;
m_Instance = NULL ;
}
} int GetTest()
{
return m_Test;
} private:
Singleton(){ m_Test = 0; }
static Singleton *m_Instance;
int m_Test;
}; Singleton *Singleton ::m_Instance = NULL;

双重检查加锁的优势在于:

(1)没有实例化Singleton时,全部调用静态函数GetInstance的线程都会堵塞在lock上,仅仅有第一个调用者能获取该lock,实例化该类。

(2)已经实例化Singleton时。全部调用者线程就不用排队获取lock。直接获取实例化对象

[C++设计模式] singleton 单例模式的更多相关文章

  1. 一天一个设计模式——(Singleton)单例模式(线程安全性)

    一.模式说明 有时候,我们希望在应用程序中,仅生成某个类的一个实例,这时候需要用到单例模式. 二.模式类图 三.模式中的角色 Singleton角色,该模式中仅有的一个角色,该角色有一个返回唯一实例的 ...

  2. 设计模式—singleton(单例模式)

    单例模式 单例设计模式属于创建型模式,它提供了一种创建对象的最佳方式.这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建. 这个类提供了一种访问其唯一的对象的方式,可以直接 ...

  3. C++设计模式-singleton单例模式_new

      class nocopyable { protected: nocopyable(){}; virtual ~nocopyable(){}; nocopyable(const nocopyable ...

  4. C++设计模式-Singleton单例模式

    template <typename T> class Singleton { public: template <typename... Args> static T* In ...

  5. 设计模式之单例模式(Singleton)

    设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...

  6. 每天一个设计模式-4 单例模式(Singleton)

    每天一个设计模式-4 单例模式(Singleton) 1.实际生活的例子 有一天,你的自行车的某个螺丝钉松了,修车铺离你家比较远,而附近的五金店有卖扳手:因此,你决定去五金店买一个扳手,自己把螺丝钉固 ...

  7. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  8. 设计模式(4) -- 单例模式(Singleton)

    设计模式(4)  -- 单例模式(Singleton) 试想一个读取配置文件的需求,创建完读取类后通过New一个类的实例来读取配置文件的内容,在系统运行期间,系统中会存在很多个该类的实例对象,也就是说 ...

  9. 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)

    原文:乐在其中设计模式(C#) - 单例模式(Singleton Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 单例模式(Singleton Pattern) 作者:weba ...

随机推荐

  1. (7)C#流程控制

    一.判断语句 if if可以单独使用,else不能单独使用 ; ) { Console.WriteLine("aaa); } Console.WriteLine("xxx" ...

  2. 51nod 1004 n^n的末位数字【快速幂】

    1004 n^n的末位数字 题目来源: Author Ignatius.L (Hdu 1061) 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 给出 ...

  3. lor实践

    1.启动一个nginx监听8888端口, -p 指定工作目录 -c 指定加载配置文件 在nginx.conf中,写一个server,进入lor项目的入口文件main.lua 2.main.lua执行r ...

  4. List和ArrayList的区别和联系

    1.    List是一个接口,而ArrayList是List接口的一个实现类. ArrayList类继承并实现了List接口. 因此,List接口不能被构造,也就是我们说的不能创建实例对象,但是我们 ...

  5. DIV层+CSS实现锁屏

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  6. /etc/fstab 官方文档

    1什么是fstab 2fstab文件示例 3fstab 文件组成 4文件系统标识 4.1Kernel naming 4.2UUID 4.3Label 5建议 5.1atime 参数 5.2tmpfs ...

  7. java随机打乱集合顺序

    public static void main(String[] args) { List <Integer> intList = new ArrayList<Integer> ...

  8. 【spring data jpa】【mybatis】通过反射实现 更新/保存 实体的任意字段的操作

    代码如下: //代码示例:例如保存时,传入下面两个字段 String filed;String content; //User代表要更新的实体,user即本对象 //filed代表要更改的字段,例如u ...

  9. 【sublime】sublime Text 3 javaScript代码自动提示插件&安装步骤 &启动Debug模式

    最近使用sublime开发node.js,但是sublime的js代码在书写的时候并没有提示功能. 因此搜到资料,用于安装代码自动提示插件. 1.打开sublime,然后快捷键Ctrl+Shift+P ...

  10. hdu 1162 Eddy&#39;s picture (Kruskal算法,prim算法,最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162 [题目大意] 给你n个点的坐标,让你找到联通n个点的一种方法.保证联通的线路最短,典型的最小生成 ...