单例模式定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
所有类都有构造方法,不编码则系统默认生成空的构造方法,若有显示定义的构造方法,默认的构造方法就会失效。
通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象,一个最好的办法就是,让类自身负责保存它的唯一实例,这个类可以保证,没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。
单例模式因为Singleton类封装它的唯一实例,这样它可以严格地控制客户怎样访问它以及何时访问它。简单地说就是对唯一实例的受控访问。
单例模式(Singleton)结构图
Singleton类,定义一个GetInstance操作,允许客户访问它的唯一实例,GetInstance是一个静态方法,主要负责创建自己的唯一实例。
1.懒汉模式(线程不安全)
申明了一个静态对象,在用户第一次调用时初始化;
虽然节约了资源,但是第一次加载时需要实例化,反应稍慢,而且多线程时不能正常工作;
2.懒汉模式(线程安全)
lock:确保当一个线程位于代码的临界区时,另一个线程不进入临界区。
可以在多线程中工作,但是每次调用GetInstance方法时都需要进行同步,造成不必要的同步开销,而且大部分时候我们是用不到同步的,所以不建议用这种模式。
3.双重锁定
双重锁定这种方式采用双锁机制,安全且在多线程情况下能保持高性能。
4.静态初始化
静态初始化C#与公共语言运行库也提供了一种“静态初始化”方法,这种方法不需要开发人员显示地编写线程安全代码,即可解决多线程环境下它是不安全的问题。
这种静态初始化的方式是在自己被加载时就将自己实例化,所以被形象地称之为饿汉式单例类。
网友评论