概念
Singleton,保证一个类仅有一个实例,并提供一个访问他的全局访问点。
通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的方法就是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。
多线程时的单例
问题:
多个线程同时访问Singleton类,调用GetInstance()方法,会可能造成创建多个实例,如何处理?
解答:
给进程加一把锁来处理
(lock语句--lock是确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一致等待,直到该对象被释放。)
保证了多线程环境下同时访问也不会造成多个对象实例的生成。
问题:
解答:
需改进的地方
优化方法
双重锁定
问题:
解答:
静态初始化
不需要显式编写安全代码,即可解决多线程环境下不安全的问题。
解决了单例模式试图解决的两个基本问题:全局访问和实例化控制。公共静态属性为访问实例提供了一个全局访问点。
不同之处在于它依赖公共语言运行库来初始化变量。
注意:instance变量标记为readonly,意味着只能在静态初始化期间或在类构造函数中分配变量。
饿汉式单例类
静态初始化的方式(上面的注意)是在自己被加载时就将自己实例化
懒汉式单例类
在第一次被引用时,才将自己实例化。
两者的区别