栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

设计模式(一)——单例模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式(一)——单例模式

1. 懒汉式单例模式

直接返回instance对象的地址

//单例模式:一个类不管创建多少次对象


//饿汉式单例模式  静态对象 数据段 在main函数之前就创建好了  一定线程安全
//
#include
 
using namespace std;

class Singleton {
public:
    static Singleton* getInstance() { // 3. 通过类的静态方法获取类的唯一实例对象
        return &instance;
    }
private:
    static Singleton instance; //2.定义一个唯一的类的实例对象
    Singleton() {   //1.构造函数私有化

    }
    Singleton(const Singleton&) = delete; //4. 拷贝构造和赋值重载删除
    Singleton& operator=(const Singleton&) = delete;
};
Singleton Singleton::instance;  
int main() {
    Singleton *p1 = Singleton::getInstance();
    Singleton *p2 = Singleton::getInstance();
    Singleton *p3 = Singleton::getInstance();

    system("pause");
    return 0;
}
2. 饿汉式单例模式

写法一:

将instance改为指针

get中判断是否为空指针

添加互斥锁和多重判定保证线程安全

//单例模式:一个类不管创建多少次对象


//饿汉式单例模式  静态对象 数据段 在main函数之前就创建好了  一定线程安全
//懒汉式单例模式代码  是不是线程安全  不是! 可能会在get时进去两次
#include
#include

using namespace std;
std::mutex mtx;

class Singleton {
public:
    // 线程安全的懒汉式单例模式
    // 是不是可重入函数?锁+双重判断(可重入:一个函数没有被执行完再被调用一次  递归 多线程)
    static Singleton* getInstance() { // 3. 通过类的静态方法获取类的唯一实例对象
       //lock_guard guard(mtx); //加锁来保证线程安全  锁的粒度太大了 单线程不用加锁

        if (instance == nullptr) {  // 第一次进来为空 才new对象

            lock_guard guard(mtx);//单线程只需要第一次加锁解锁
            if (instance == nullptr) {
                
                instance = new Singleton();
            }
        }
        return instance;
    }
private:
    // 加volitile 线程不用缓存
    static Singleton *volatile instance; //2.定义一个唯一的类的实例对象
    Singleton() {   //1.构造函数私有化

    }
    Singleton(const Singleton&) = delete; //4. 拷贝构造和赋值重载删除
    Singleton& operator=(const Singleton&) = delete;
};
Singleton*volatile  Singleton::instance = nullptr;  

int main() {
    Singleton *p1 = Singleton::getInstance();
    Singleton *p2 = Singleton::getInstance();
    Singleton *p3 = Singleton::getInstance();

    system("pause");
    return 0;
}

写法二:
直接返回函数静态局部对象 自动加锁

#include

using namespace std;

// 线程安全的懒汉式单例模式 https://blog.csdn.net/QIANGWEIYUAN
class Singleton
{
public:
	static Singleton* getInstance() // #3 获取类的唯一实例对象的接口方法
	{
		// g++ -o run 单例模式.cpp -g   gdb run
		// 函数静态局部变量的初始化,在汇编指令上已经自动添加线程互斥指令了
		static Singleton instance; // #2 定义一个唯一的类的实例对象
		return &instance;
	}
private:
	Singleton() // #1 构造函数私有化
	{
		// 很多初始化的代码
	}
	Singleton(const Singleton&) = delete;
	Singleton& operator=(const Singleton&) = delete;
};

int main()
{
	Singleton *p1 = Singleton::getInstance();
	Singleton *p2 = Singleton::getInstance();
	Singleton *p3 = Singleton::getInstance();

	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1024498.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号