单例模式的单线程实现:
将构造函数和静态实例设置为private
#include<iostream>
using namespace std;
class singleton
{
protected:
singleton(){}
private:
static singleton* p;
public:
static singleton* instance(){
if (p == NULL)
p = new singleton();
return p;
}
};
类的静态成员如果要在外部使用的话,需要在外部初始化
class singleton
{
private:
singleton(){}
static singleton* p;
public:
singleton* instance();
};
// static 成员一定要在类外初始化
singleton* singleton::p = NULL;
singleton* singleton::instance()
{
if (p == NULL)
p = new singleton();
return p;
}
当两个线程都判断了if(instance==NULL) 但是又都没有新建一个对象的时候,就会生成两个对象。
方法一是加锁:
加锁可以正常运行,但是效率不高
class singleton
{
private:
singleton(){}
static singleton* p;
public:
singleton* instance();
};
// static 成员一定要在类外初始化
singleton* singleton::p = NULL;
singleton* singleton::instance()
{
// lock();
if (p == NULL)
p = new singleton();
// unlock();
return p;
}
进一步有效效率,只是在多个线程第一次尝试创建实例的时候加锁。
class singleton
{
private:
singleton(){}
static singleton* p;
public:
singleton* instance();
};
// static 成员一定要在类外初始化
singleton* singleton::p = NULL;
singleton* singleton::instance()
{
if (p == NULL)
// 进一步提升效率,只是在多个线程第一次尝试创建实例的时候加锁
// lock();
if (p == NULL)
p = new singleton();
// unlock();
return p;
}
在C#里面可以通过静态变量静态构造函数来构造单例模式
利用静态变量实现单例模式
按 Ctrl+C 复制代码
public class SingletonThird
{
/// <summary>
/// 静态变量
/// </summary>
private static SingletonThird _SingletonThird = new SingletonThird();
public static SingletonThird CreateInstance()
{
return _SingletonThird;
}
}
按 Ctrl+C 复制代码
是不是觉得很优雅, 利用静态变量去实现单例, 由CLR保证,在程序第一次使用该类之前被调用,而且只调用一次
PS: 但是他的缺点也很明显, 在程序初始化后, 静态对象就被CLR构造了, 哪怕你没用。
利用静态构造函数实现单例模式
复制代码
public class SingletonSecond
{
private static SingletonSecond _SingletonSecond = null;
static SingletonSecond()
{
_SingletonSecond = new SingletonSecond();
}
public static SingletonSecond CreateInstance()
{
return _SingletonSecond;
}
}
复制代码
静态构造函数:只能有一个,无参数的,程序无法调用 。
同样是由CLR保证,在程序第一次使用该类之前被调用,而且只调用一次
同静态变量一样, 它会随着程序运行, 就被实例化, 同静态变量一个道理。