说明
定义:
保证一个类仅有一个实例,并提供一个全局访问点
类型:创建型
适用场景:
想确保任何情况下都绝对只有一个实例
优点:
在内存里只有一个实例,减少了内存开销
可以避免对资源的多重占用
设置全局访问点,严格控制访问
缺点:
没有接口,扩展困难
重点:
私有构造器
线程安全
延迟加载
序列化和反序列化安全
反射
一、懒汉式
1.1 双重检查机制
package com.study.single_instance.java.lazy;
public class DoubleCheckSingleInstance {
private volatile static DoubleCheckSingleInstance doubleCheckSingleInstance=null;
private DoubleCheckSingleInstance(){
}
public static DoubleCheckSingleInstance getInstance(){
if(doubleCheckSingleInstance==null){
synchronized (DoubleCheckSingleInstance.class) {
if(doubleCheckSingleInstance==null) {
doubleCheckSingleInstance = new DoubleCheckSingleInstance();
}
}
}
return doubleCheckSingleInstance;
}
}
1.2 静态内部类的方式
package com.study.single_instance.java.lazy;
public class StaticClassSingleInstance {
private static StaticClassSingleInstance staticClassSingleInstance=null;
private StaticClassSingleInstance(){
}
private static class InnerInstanceHolder{
private static StaticClassSingleInstance staticClassSingleInstance=new StaticClassSingleInstance();
}
public static StaticClassSingleInstance getInstance(){
return InnerInstanceHolder.staticClassSingleInstance;
}
}
二、饿汉式
2.1 成员变量初始化
package com.study.single_instance.java.hungry;
import java.io.Serializable;
public class LazySingleInstance implements Serializable,Cloneable {
private final static LazySingleInstance lazySingleInstance=new LazySingleInstance();
private LazySingleInstance(){
}
public static LazySingleInstance getInstance(){
return lazySingleInstance;
}
public Object readResolve(){
return lazySingleInstance;
}
}
2.2 成员变量静态代码块初始化
package com.study.single_instance.java.hungry;
public class LazyStaticInitSingleInstance {
private final static LazyStaticInitSingleInstance lazyStaticSingleInstance;
static {
lazyStaticSingleInstance = new LazyStaticInitSingleInstance();
}
private LazyStaticInitSingleInstance(){
}
public static LazyStaticInitSingleInstance getInstance(){
return lazyStaticSingleInstance;
}
}
三、多线程调试方法