参考:https://blog.kuangstudy.com/index.php/archives/414/
单例模式的作用就是保证一个类全局只有一个实例,因此可以减少内存的消耗。
常见的单例模式包括:饿汉式、懒汉式、DCL懒汉式、静态内部类饿汉式、枚举单例
例子包括kotlin与java两种代码
一、饿汉式
饿汉式特点是线程安全(类装载的时候就初始化了),调用效率高,但是不能延时加载,若类的构造方法里有很多耗内存的变量则会导致类在被getInstance之前就申请了不少内存,造成内存浪费
二、懒汉式
懒汉式之所以叫懒汉式是因为采用了懒加载的方式,克服了饿汉式的无法延迟加载的缺陷,但也因此降低了调用效率(因为采用了原子操作),线程安全。
三、DCL懒汉式
DCL懒汉式优化了懒汉式中synchronized导致的性能较慢问题,同时增加volatile关键字修饰单例对象,防止指令重排导致的多线程同时进入到双重判定的代码块中,导致的创建多实例情况
四、饿汉式改进(静态内部类)
静态内部类在当前类加载时不会初始化因此避免了加载时的内存开销,通过在静态内部类中创建对象,也可以实现懒加载,同时由于是静态类和变量,因此线程安全。缺点是不适合有参构造函数的类
五、枚举单例
上述单例模式都不能防止通过反射的方式实例化多个对象,只有枚举单例模式能够防止反射,且同时能够保证线程安全