小小单例,一点也不小。今天终于发现了原来单例模式还有这么多道道~~
***单例模式解决了两个基本问题:全局访问和实例化控制
出自:大话设计模式
懒汉式单例模式:
定义:要在第一次被引用时,才会将自己实例化,所以就被称为懒汉式单例模式,也就是我们常用的单例模式。
一般常用示例:
单重锁定示例: 缺点:每次调用GetInstance方法时都需要lock,影响性能
双重锁定示例:
为什么要判断两次?
对于instance存在的情况,就直接返回,这没有问题。当instance为null并且同时有两个线程调用GetInstance()方法时,它们将都可以通过第一重instance==null的判断。然后由于lock机制,这两个线程则只有一个进入,另一个在外排队等候,必须要其中一个进入并出来后,另一个才能进入。而此时如果没有了第二次的instance是否为null判断,则第一个线程创建了实例,而第二个线程还是可以继续再创建新的实例。
饿汉式单例模式:
定义:由于静态初始化的方式是在自己被加载时就将自己实例化,所以被形象的称为饿汉式单例模式。
示例:
懒汉式和饿汉式区别:
由于饿汉式,即静态初始化的方式,它是类一加载就实例化的对象,所以要提前占用系统资源。然而懒汉式,又会面临着线程访问的安全性问题,需要做双重锁定这样的处理才可以保证安全。