单例模式的几种 C++ 实现
2024年3月26日 17:00
写在前面
在开发中,有时候会需要一些类在项目的生命周期中只有一个实例。这样的设计被称作单例模式。
本文用于记录项目开发过程中,设计日志管理器时用到的单例模式,以及开发过程中的一些学习和思考。
饿汉与懒汉
单例模式中有饿汉和懒汉两种模式,饿汉模式指在程序启动时即进行单例的构造;懒汉模式为懒加载,只有第一次调用时才会进行单例的构造。
在多线程开发中,要求对象的 this 指针在构造期间不被泄漏。饿汉模式只要选择合适的单例构造时间,即可保证;但是懒汉模式可能会在多线程并发调用时,触发线程安全问题1。
本文主要关注懒汉模式下单例构造时的多线程安全问题。
最简单的版本
在设计单例模式时,考虑到生命周期中只有一个实例,那么类的构造函数应当是不应该被使用者随意调用的,但是又需要生成单例使用。基于这个要求,可以得到最基本的两点:
- 类的构造函数应当是 private 的。
- 类应该提供一个静态函数用于获取单例。
基于以上要求,先写一个简单版本。
1 | // log_manager.h |