单例模式的意义
保证全局只会创建一个对象,比如 日志模块全局只有一个,windows的任务管理器等,这样可以避免频繁的创建销毁对象,还可以避免对共享资源的多重占用,具体例子和好处坏处看参考资料[9],不赘述
几个要考虑的问题:
- 懒加载;;
- 线程安全生存周期的考虑;;
- 反序列化;;
- 反射单例;;
- 克隆单例
实现思想
首先是一个唯一性,保证全部成员只能访问到一个共同的对象
为了防止对象被创建多次,要把构造函数设为private,以防止被他人调用重复建立,而自己单独实现一个接口用来获取实例(可以把构造函数当作这个接口吗?),并且要把赋值函数operator=删去,拷贝构造函数会导致创建新对象也要删掉,
自己实现的接口中,防止对象地址暴露被用户delete,返回类型不能为指针,又因为删掉了拷贝构造,所以只能返回引用所以要注意get()不能返回指针类型,
不太行的方案
- 如果把数据用static包装,即 static singleton data,可以实现单例模式,但是缺点是在程序开始的时候初始化启动比较慢,如果没用到这个单例模式还是会占用一定的空间
- 如果把数据用指针存储,在getdata的时候创建,需要加锁来保证线程安全,一种方式是DCL,但是C++里volitile不像java,防止不了指令重排(如指令重排、多核处理器等问题让DCLP实现起来比较复杂),这里不赘述,见参考资料
- DCL在C++里可以利用barrier来实现,能防止指令重排,陈硕说这个用这个杀鸡用牛刀(可能开销太大吧)
std::atomic<Singleton*> m_instance;
Singleton* Singleton::getInstance() {
Singleton* tmp = m_instance.