单例模式是实际开发中常用到的设计模式,现在推荐使用“延时加载占位类”的模式设计单例,之前流行的双重检查加锁(Double Check Lock)的模式是有缺陷的。
延时加载占位类其实就是静态内部类,为啥采用静态内部类的方式既能实现延时加载又能保证线程安全呢?
延时加载,是因为内部类,不论是静态内部类还是非静态内部类,都是需要时才会加载,只使用外部类时不加载。
线程安全是由JVM保证的,jvm在加载类时,就会执行静态属性(字段)和静态代码块,而且执行执行一次。编译器在编译阶段会自动收集类所有的静态变量赋值和静态代码块,生成类构造器<clinit>(),类加载过程中的初始化阶段就是执行类构造器,jvm保证了只会执行一次。
说明一下什么叫一个类被需要?
一个类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生。也就是说,要实例化一个对象,或者调用静态方法,就说明这个类被需要了,进行加载了。