这个设计模式主要目的是想在整个系统中仅仅能出现一个类的实例。这样做当然是有必定的。比方你的软件的全局配置信息,或者是一个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。直接获取实例化对象

最新文章

  1. Java动态编译
  2. 从零学java--传智播客
  3. html选中文字 背景/字 变色
  4. 拓扑排序(二)之 C++详解
  5. RedHat版的linux安装yum源及redis
  6. Xcode连接git@osc
  7. Java入门到精通——开篇
  8. Python学习 - 使用BeautifulSoup来解析网页一:基础入门
  9. Laravel 简单使用七牛云服务
  10. 对pathtracing的一些个人理解
  11. video视频铺满
  12. Ubuntu 环境 TensorFlow (最新版1.4) 源码编译、安装
  13. Feature Preprocessing on Kaggle
  14. JVM进程启动会启动哪些线程?
  15. php通过某个日期段的周几,获取选中周几对应的日期
  16. django管理后台添加admin账号
  17. 利用cygwin创建windows下的crontab定时任务
  18. 继承自NSObject的不常用又很有用的函数(1)
  19. Generalized normal distribution and Skew normal distribution
  20. div 标签

热门文章

  1. ubuntu16下安装telnet和opensshserver
  2. 关于python浮点数的精度问题。
  3. 实现如下语法的功能:var a = add(2)(3)(4); //9
  4. 牛客网 暑期ACM多校训练营(第二场)D.money-贪心 or 动态规划
  5. Python的程序结构[2] -&gt; 类/Class[3] -&gt; 内建类与内建函数
  6. Google Kickstart Round E 2018 B. Milk Tea
  7. postgres表空间、模式、表和用户/角色之间的关系
  8. Xamarin XAML语言教程通过ProgressTo方法对进度条设置
  9. 线程同步工具之CountDownLatch
  10. [android]加载大量图片避免OOM