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 使用枚举数据类型实现单例模式
使用枚举类时,构造方法会被自动调用