这个模式其实就是要保证只有一个实例存在。通常的实现思路就是持有一个私有静态实例,保证仅一次初始化,以getInstance方法返回。但是实际实现这个模式要考虑更多细节:
- 线程安全与DLC
- 单例对象的析构与销毁
- 组件中单例对象的管理
- 单例模式的单元测试
使用C++实现还必须额外注意一些实现细节
- 静态成员变量初始化顺序不依赖构造函数, 多个单例可能初始化顺序不对
- 延迟初始化(第一次使用才初始化)需要考虑线程安全
- 接口返回引用更安全,防止被误delete,C++11以后推荐使用智能指针
- 将default产生的函数定义为private
- 注意最后析构问题,要有检查dead-reference
C++考虑延迟初始化的线程安全,推荐的实现一种是DLC并添加必要的内存屏障1,Linux上面也可以利用pthread_once来实现。
考虑到通用性更好的一种是使用Proxy-Class,可以参考Boost的实现3。C++11以后已经有了解决线程安全最佳的实现,就是使用并返回局部静态变量2。
使用Java实现因为volatile语义的加强,将私有静态实例声明后可以直接使用DLC,但这种实现并没有性能优势。由于JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的。因此可以使用获取内部类的实例来实现。
参考文章:
抢沙发
还没有评论,你可以来抢沙发