6.1 立即加载/“饿汉模式”


调用方法前,实例已经被创建了
// 立即加载方式
private static MyObject myObject=new MyObject();
return myObject;
MyObject.getInstance.hashCode();

6.2 延迟加载/懒汉模式

调用方法时,实例才创建
private static MyObject myObject;

if(myObject===null){
myObject=new myObject;
}
return myObject

延迟加载,在多线程环境中,会创建出“多例”;

解决方案:

synchronize 同步方法,运行效率低;
synchronize 同步语句块 (范围大小调整) 运行效率低,范围调小后,不能保证线程安全;
使用DCL双检查锁机制
private volatile static MyObject myObject // volatile 具有可见性、有序性,不具有原子性,直接存于主存中

1分钟读懂java中的volatile关键字

https://baijiahao.baidu.com/s?id=1595669808533077617&wfr=spider&for=pc
if(myObject!=null){ // 一层检查
}else{
synchronized(MyObject.class){
if(myObject==null){ // 二层检查
myObject=new MyObject();
}
}
}
return myobject;

6.3 使用静态内置类实现单例模式

private static class MyObjectHandler{
private static MyObject myObject=new MyObject();

}

public static MyObject getInstance(){
retun MyObjectHandler.myObject();
}

6.4 序列化与反序列化的单例模式实现

FileOutputStream fosRef=new FileOutputStream(new File(“myObjectFile.txt”));
ObjectOutputStream oosRef=new ObjectOutputStream(fosRef);
oosRef.writeObject(myObject);

FileInputStream fisRef=new FileInputStream(new File(“myObjectFile.txt”));
ObjectInputStream iosRef=new ObjectInputStream(fisRef);
MyObject myObject=(MyObject)iosRes.readObject();

6.5 使用static代码块实现单例模式

在使用类的时候已经执行静态代码块
private static MyObject instance=null;

static{
instance=new MyObject();
}

6.6 使用枚举数据类型实现单例模式

使用枚举类时,构造方法会被自动调用