单例模式

2018-06-19  本文已影响0人  yshi2017

-------------------------------------------最简单的单线程下的单例模式-------------------

-----.h文件-----

class SingletTon

{

public:

  ~SingletTon();

public:

static SingletTon *getInstance();      //  获取唯一实例的静态函数

private:

  SingletTon();

private:

  static SingletTon *m_pInstance;        //  本类的私有静态成员

};

-----CPP文件----

SingletTon * SingletTon::m_pInstance = NULL;      //  本类的静态成员的初始化操作

SingletTon * SingletTon::getInstance()

{

    if (m_pInstance == NULL)

{

    m_pInstance = new SingletTon();

}

return m_pInstance;

}

在多线程环境下时候,需要在代码中加锁。

加锁后实现:

SingletTon * SingletTon::getInstance()

{

    lock();

    if (m_pInstance == NULL)

{

    m_pInstance = new SingletTon();

}

      unlock();

      return m_pInstance;

}

但是这样在线程数量多时候会出现阻塞问题:

原因(每次判断实例为空时候都要被锁定,这样很多的线程都会在判空之前被锁定,造成阻塞)

用双重锁定来解决:

SingletTon * SingletTon::getInstance()

{

  if (m_pInstance == NULL)

{

  lock();

if (m_pInstance == NULL)

{

    m_pInstance = new SingletTon();

}

    unlock();

}

return m_pInstance;

}

------------------------------------------------------------------

单例模式分为懒汉模式和饿汉模式

懒汉:即不到万不得已不创建对象实例,也就是说在用到这个实例的时候才会取创建。

饿汉 :饿了之后饥不择食,所以在定义的时候就进行创建。

上一篇下一篇

猜你喜欢

热点阅读