C++用多种方式实现Singleton单例模式
来源:互联网 发布:如何注册两个淘宝账号 编辑:程序博客网 时间:2024/05/21 18:34
题目:设计一个类,只能生成该类的一个实例。
(1)解法一:只适用于单线程环境
由于要求只能生成一个实例,因此我们必须把构造函数设为私有函数以禁止他人创建实例。我们可以定义一个静态的实例,在需要的时候创建该实例。
public class Singleton1{ private Singleton1(){ } private static Singleton1 instance = NULL; public static Singleton1 funcInstance{ get{ if(instance == NULL){ instance = new Singleton1(); } return instance; } } }
上述代码在Singleton1的静态方法funcInstance()中,只有在instance为null的时候才创建一个实例以避免重复创建,同时把构造函数定义为私有函数,这样才能确保只创建一个实例。
(2)解法二:虽然能在多线程环境中能工作但是效率不高
解法一中的代码在单线程的时候工作正常,但是在多线程的情况下就有问题了。假设两个线程同时运行到判断instance是否为null的if语句,并且instance的确没有创建时,那么两个线程都会创建一个实例,此时就不再满足单例模式的要求了。
为了保证在多线程环境下我们还是只能得到类型的一个实例,需要加上一个同步锁。实现如下:
public class Singleton2{ private Singleton2(){ } private static readonly object syncObj = new object(); private static Singleton2 instance = NULL; public static Singleton2 funcInstance{ get{ lock(sync){ if(instance == NULL){ instance = new Singleton2(); } } return instance; } } }
我们还是假设有两个线程同时想创建一个实例。由于在一个时刻只有一个线程能得到同步锁,当第一个线程加上锁时,第二个线程只能等待。当第一个线程发现实例还没有创建时,他创建出一个实例。接着第一个线程释放同步锁,此时第二个线程可以加上同步锁,并运行接下来的代码。这个时候由于实例已经被第一个线程创建出来了,第二个线程就不会重复创建实例了。但是加锁是一个比较耗时的操作,我们应该尽量避免。
(3)解法三:加同步锁前后两次判断实例是否已存在
我们只是在实例还没有创建之前需要加锁操作,以保证只有一个线程创建出实例。而当实例已经创建之后,就不需要加锁操作了。代码实现如下:
public class Singleton3{ private Singleton3(){ } private static readonly object syncObj = new object(); private static Singleton3 instance = NULL; public static Singleton3 funcInstance{ get{ if(instance == NULL){ lock(sync){ if(instance == NULL){ instance = new Singleton3(); } } } return instance; } } }
Singleton3中只有当instance为NULL即没有创建时,需要加锁操作。当instance已经创建出来后,则无需加锁。因为只有第一次的时候instance为NULL,因此只有在第一次试图创建实例的时候需要加锁,这样Singleton3的时间效率就比Singleton2好。
github主页:https://github.com/chenyufeng1991 。欢迎大家访问!
1 0
- C++用多种方式实现Singleton单例模式
- 单例模式的多种实现方式
- 单例模式的多种实现方式
- 单例设计模式多种实现方式
- 【单例模式】的多种实现方式
- Objective C 实现Singleton(单例)模式.
- c++--Singleton单例模式的实现
- 关于单例(Singleton)模式实现方式的反思
- 单例模式的三种实现方式:singleton
- 单例模式singleton的几种实现方式
- 单例模式--Singleton的两种实现方式
- c++-单例模式Singleton
- JAVA设计模式——单例(Singleton)模式 多种实现方法
- 实现Singleton(单例)模式.
- Objective —C 的单例模式 Singleton实现
- Singleton 单例模式学习 (c++)实现
- ios object-c 实现Singleton(单例)模式
- Object-C 中实现 Singleton (单例) 模式
- 例题9-11 最大面积的最小的三角剖分 UVa1331
- 数据结构之---C语言实现关键路径AOE图
- 树的共同祖先
- 5种创建UIImage的类方法
- Java开发中的23种设计模式详解(转)
- C++用多种方式实现Singleton单例模式
- atitit.javascript js 上传文件的本地预览
- std::find, std::find_if, std::find_if_not
- 构建稳定成熟的数据仓库
- Android媒体扫描代码分析
- C++编程(五)--- Cmake详解&Makefile详解
- Java DOM解析Xml中文乱码问题
- Atitit. 。Jna技术与 解决 java.lang.Error: Invalid memory access
- Image Effect之Blur(飞车模糊)