专门做水产海鲜的网站吗,营销成功案例,苏州注册公司地址,户网站建设的不全.文章目录 1.单例模式的特点#x1f60a;2.单例模式两种实现#x1f923;#x1f917;#x1f60a;2.1 饿汉式2.2 懒汉式 3.传统单例模式的线程安全问题4.解决方法4.1静态局部变量4.2加锁4.3双重检查锁#xff08;DCL#xff09;4.4pthread_once 1.单例模式的特点#x1… 文章目录 1.单例模式的特点2.单例模式两种实现2.1 饿汉式2.2 懒汉式 3.传统单例模式的线程安全问题4.解决方法4.1静态局部变量4.2加锁4.3双重检查锁DCL4.4pthread_once 1.单例模式的特点 1.全局只有一个类的static实例存在 2.不允许直接实例化构造函数为私有的只通过一个类的静态方法获取该实例 2.单例模式两种实现
2.1 饿汉式 饿汉式是在类加载的时候就会创造实例会造成资源的浪费。 具体内部先定义并初始化好了一个静态实例。获取方法中直接返回实例。 特点线程安全会造成资源浪费 实现
class Singleton {
private:static Singleton instance;// 私有构造函数防止类外实例化对象Singleton() {}public:// 获取实例的静态方法static Singleton getInstance() {return instance;}// 其他成员函数void doSomething() {// do something}
};// 静态成员变量需要在类外初始化
Singleton Singleton::instance;int main() {// 获取单例对象实例Singleton singleton Singleton::getInstance();// 调用单例对象的方法singleton.doSomething();return 0;
}
2.2 懒汉式
懒汉式是在需要时才创建实例通过获取实例方法获取实例。 具体内部定义一个静态实例获取方法中判断实例是否为空空则初始化实例否则返回该实例 特点避免资源浪费造成线程安全问题。 实现
class Singleton {
private:// 静态成员变量用于保存单例实例static Singleton* instance;// 构造函数私有化防止外部创建实例Singleton() {}public:// 静态成员函数用于获取单例实例static Singleton* getInstance() {// 判断实例是否为空如果为空则创建实例if (instance nullptr) {instance new Singleton();}return instance;}// 删除拷贝构造函数和拷贝赋值运算符防止被复制Singleton(const Singleton) delete;Singleton operator(const Singleton) delete;
};Singleton* Singleton::instance nullptr; // 初始化静态成员变量int main() {// 获取单例实例Singleton* singleton1 Singleton::getInstance();Singleton* singleton2 Singleton::getInstance();// 判断两个实例是否相同if (singleton1 singleton2) {cout 两个实例相同 endl;} else {cout 两个实例不相同 endl;}return 0;
}
3.传统单例模式的线程安全问题
饿汉式是线程安全的懒汉式不是 当多线程执行getInstance时候如果线程A判断当前实例为空线程B正好判断到也为空就会申请资源当线程A恢复了后继续执行也会申请内存空间就会出现两个实例这就会出现问题
4.解决方法
4.1静态局部变量
class Singleton {
private:Singleton() {}public:static Singleton* getInstance() {static Singleton instance;return instance;}
};
4.2加锁
class Singleton {
private:// 静态成员变量用于保存单例实例static Singleton* instance;// 构造函数私有化防止外部创建实例Singleton() {}public:// 静态成员函数用于获取单例实例static Singleton* getInstance() {// 判断实例是否为空如果为空则创建实例Mutexlock lock(mutex);//加锁if (instance nullptr) {instance new Singleton();}return instance;}// 删除拷贝构造函数和拷贝赋值运算符防止被复制Singleton(const Singleton) delete;Singleton operator(const Singleton) delete;
};Singleton* Singleton::instance nullptr; // 初始化静态成员变量int main() {// 获取单例实例Singleton* singleton1 Singleton::getInstance();Singleton* singleton2 Singleton::getInstance();// 判断两个实例是否相同if (singleton1 singleton2) {cout 两个实例相同 endl;} else {cout 两个实例不相同 endl;}return 0;
}4.3双重检查锁DCL
class Singleton {
private:// 静态成员变量用于保存单例实例static Singleton* instance;// 构造函数私有化防止外部创建实例Singleton() {}public:// 静态成员函数用于获取单例实例static Singleton* getInstance() {// 判断实例是否为空如果为空则创建实例if (instance nullptr) {Mutexlock lock(mutex);if(instancenullptr)instance new Singleton();}return instance;}// 删除拷贝构造函数和拷贝赋值运算符防止被复制Singleton(const Singleton) delete;Singleton operator(const Singleton) delete;
};Singleton* Singleton::instance nullptr; // 初始化静态成员变量int main() {// 获取单例实例Singleton* singleton1 Singleton::getInstance();Singleton* singleton2 Singleton::getInstance();// 判断两个实例是否相同if (singleton1 singleton2) {cout 两个实例相同 endl;} else {cout 两个实例不相同 endl;}return 0;
}4.4pthread_once
#includeiostream
class singleton{
public:
static singleton getinstance()
{
pthread_once(ponce,init);//保证该函数只被执行一次
return instance;
}
private:
static void init()
{
instancenew singleton();
}
singleton(){}
~singleton(){}
static pthread_once_t ponce;
static singleton* instance;
};
singleton::poncePTHREAD_ONCE_INIT;
singleton::instancenullptr;