懒汉模式
懒汉模式的问题
线程安全问题
双重检查 加锁优化
编译器(JIT),cpu可能会对指令进行重排序,导致使用到尚未初始化的实例,通过加volatile关键字修饰来防止重排序
public class LHanSimple {private static volatile LHanSimple lHanSimple;public LHanSimple() {}public static LHanSimple ins(){if (lHanSimple == null){synchronized (EHanSimple.class){if (lHanSimple == null){lHanSimple = new LHanSimple();}}}return lHanSimple;}}
饿汉模式
类加载的初始化阶段完成实例的初始化,本质上借助于jvm类的加载机制保证了实例的唯一性
类记载过程
1:将类信息加载到内存中,生成对应的class数据结构
2:连接:``
a 验证
b 准备(给类的静态成员变量赋默认值)
c 解析
3: 初始化
只有在真正使用对应的类的时候才完成初始化(懒加载)
public class HungrySimpleClass {private static HungrySimpleClass ins = new HungrySimpleClass();public HungrySimpleClass() {}public static HungrySimpleClass getIns() {return ins;}}
静态内部类
本质上是利用类加载机制来保证线程安全
只有实际使用的时候才会触发类的初始化,所以也是懒加载的一种形式
/*** 静态内部类 懒加载 调用静态类getIns方法的第一次的时候加载*/public class InnerSingleClass {public InnerSingleClass() {}private static class InnerClassHolder{private static InnerClassHolder ins = new InnerClassHolder();}public static InnerClassHolder getIns() {return InnerClassHolder.ins;}}
