单件设计模式是非常常用的一种设计模式。当我有一个复杂的系统需要提供一个统一的配置界面的时候,这个配置对象和后台对象之间的交互常常是一对多的关系。那么配置对象常常就需要被设计成Singleton的实例。
最简单的singleton就是用一个全局对象或者函数内部的静态对象来实现。但是这样有两个明显的问题。(1) 全局对象是程序初始化的时候就构造的,如果程序启动要构造很多此类对象,会变得很昂贵。(2) C++标准并没有规定不同的编译单元的全局对象的构造顺序,所以如果不同Singleton之间的构造有相互依赖关系,那么行为是未知的。
这个实现还有多线程的问题,如果两个线程同时访问pInst==nullptr这句话,那么同时得出pInst为空的结论,new执行了两次,显然不对。所以需要引入double checked lock机制。