懒汉模式
懒汉模式的问题
线程安全问题
双重检查 加锁优化
编译器(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;
}
}