1、单例模式(Singleton)定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。如何保证呢?一个最好的方法就是让类本身负责保存他的唯一实例。结构图如下。注意: 构造函数是private的,这样就保证的外部类无法实例化该类。
2、关键是如何书写一个合格的单例类。看似最简单的方法就是在getInstance中判断是否为null,如果是则新建一个,反之则返回已经存在的。大家给了一个名字叫做“懒汉式单例”。
3、很明显,“懒汉式单例”是线程不安全的,并发环境下可能会产生多个实例。这个时候一个方法就是将getInstance方法变为同步的,也就是给该方法加锁的意思来保证线程安全。
4、但是synchronized修饰的同步方法较一般方法要慢很多,而且getInstance()会被多次调用,累积起来的性能损耗会变的非常大。因为,getInstance()会被多次调用,所以一般我们调用的时候instance实例已经非空,我们只需要在要创建instance的时候同步,提高了性能。因为判定了两次instance是否为空,所以我们叫这种方法为双重检查锁定(Double-check Locking)。
5、我们叫该方法为“懒汉式”的原因是,类在使用的时候才会被创建。相应的,我们有另外一种模式,就是在类加载的时候就初始化它。我们称之为“饿汉式单例”。优势是本身就会是线程安全的, 但是,因为这个单例没有用到也会被创建,可能会浪费内存。就像windows系统开机自启动似的~
6、针对“饿汉式单例”的缺点,我们又有了另外一种单例方式,在内中定义一个私有的内部类,在第一次用这个嵌套类时,会创建一个实例。这样就兼顾了“饿汉式单例”和“懒汉式单例”的优点,在我看来是最值得推荐的方式。这种方法,我们称之为“静态内部类单例”。
7、肯定还有其它的方式,总之就是要兼顾性能和线程安全。